5주차 알고리즘 테스트

majungha·2023년 4월 14일
1

알고리즘

목록 보기
26/71

오늘의 알고리즘 테스트 👍

📝 1. 목적지 ( destination )


  • 당신은 버스를 타고 각 종점에서 이어지는 지역들을 탐험하고자 합니다.
  • [ 버스를 탈 지역, 해당 버스의 종점 지역 ]으로 구성된 하나의 묶음이 여러개 담긴 목록, paths가 있습니다.
  • 해당 버스 종점 지역에서 출발하는 버스가 있다면, 그 버스를 타고 도착하게 되는 종점으로 이동해 같은 과정을 반복해야 합니다.
  • 만약, 도착한 지점에서 출발하는 버스가 없다면, 해당 지역을 리턴해야 합니다.
  • 당신이 최종적으로 도착하게 되는 종점, 최종 목적지를 반환해주세요.

▷ 입출력 예

destination([
        ['B', 'C'],
        ['D', 'B'],
        ['C', 'A'],
      ]); // 'A'
destination([
        ['Kwangju', 'Busan'],
        ['Seoul', 'Ansan'],
        ['Ansan', 'Kwangju'],
      ]); // 'Busan'

▷ 내 풀이

▷ 해결 못함 ❌

function destination(paths) {
    // 여기에서 작업하세요.
    let answer = [];
    paths.sort();
    for (let i = 0; i < paths.length; i++) {
        for (let j = 0; j < paths.length; j++) {
            if (paths[i][1] === paths[j][0] && paths[j][1] !== paths[i][0]) {
                answer.push(paths[j][1]);
            }
        }
    }
    return answer[0];
}
  • 이렇게 하면 입출력 예에서는 잘 나오지만, 다른 테스트케이스에서 실패를 해서 정답이 아니였던 것 같다.
  • 애초에 문제 자체를 어디서 출발하던 목적지가 하나로 이어져 있는 줄 알고 접근했던 것 같다.
  • 나중에 알고보니 paths[0][0]에서 시작하는 것을 알고 보니까 생각보다 쉬운 문제여서 당황스러웠다..

▷ for문 사용 풀이

function destination(paths) {
  // 여기에서 작업하세요.
  let nextDestination = paths[0][1];

  for (let i = 0; i < paths.length; i++) {
    for (let j = 0; j < paths.length; j++) {
      if (paths[j][0] === nextDestination) {
        nextDestination = paths[j][1];
      }
    }
  }

  return nextDestination;
}

▷ Map 매서드 사용 풀이

function destination(paths) {
  // 여기에서 작업하세요.
  const map = new Map(paths);
  let station = paths[0][0];

  while (map.has(station)) {
    station = map.get(station);
  }

  return station;
}

▷ Map, filter 매서드 사용 풀이

function destination(paths) {
  // 여기에서 작업하세요.
  const starts = paths.map((el) => el[0]);
  const destinations = paths.map((el) => el[1]);
  const answer = destinations.filter((el) => !starts.includes(el));
  return answer[0];
}

📝 2. 문자 정렬 ( sortString )


  • 순서가 뒤섞인 문자열 str이 주어집니다.
  • 해당 문자열은 몇개의 단어들로 구성되어 있습니다.
  • 단어들은 공백으로 구분되며, 각 단어에는 하나씩의 숫자가 포함되어 있습니다.
  • 입력되어 있는 숫자는 해당 문자열의 올바른 순서를 의미합니다.
  • 문자열을 올바르게 재정렬해서 완성된 문자열을 리턴해 주세요.

▷ 입출력 예

sortString('codi2ng to3gether let1s') // 'lets coding together'

▷ 내 풀이

▷ 해결 못함 ❌

function sortString(str) {
    // 여기에서 작업하세요.
    let answer = "";
    str = str.split(" ");
    for (let i = 0; i < str.length; i++) {
        for (let j = 0; j < str.length; j++) {
            if (str[i].includes(j)) {
                answer += str[i] + " ";
            }
        }
    }
    return answer;
}
  • 시간분배를 잘못한 탓에 시간이 부족해서 생각을 하다가 못 풀었다.
  • 다음 알고리즘에서는 쉬운 문제부터 풀어봐야겠다.

▷ for문 사용 풀이

function sortString(str) {
  // 여기에서 작업하세요.
  const answer = [];
  str = str.split(' ');

  for (let i = 0; i < str.length; i++) {
    let num = '';
    let newWord = '';
    for (let j = 0; j < str[i].length; j++) {
      const isNumber = !isNaN(str[i][j]);
      isNumber ? (num += str[i][j]) : (newWord += str[i][j]);
    }
    answer[num - 1] = newWord;
  }

  return answer.join(' ');
}

▷ for-of문, replace 매서드 사용 풀이

function sortString(str) {
  // 여기에서 작업하세요.
  const answer = [];
  str = str.split(' ');

  for (let word of str) {
    let num = '';
    for (let el of word) {
      num += !isNaN(el) ? el : '';
    }
    word = word.replace(num, '');
    answer[num - 1] = word;
  }

  return answer.join(' ');
}

📝 3. 문자열 타입 ( stringsInObject )


  • 객체 obj가 주어집니다.
  • obj는 a, b...와 같이 알파벳을 키로 가집니다.
  • 각 키에 대응되는 값들은 어떠한 타입이든 들어올 수 있습니다.
  • 참조된 값의 타입이 string인 데이터의 개수만 카운트하여
    해당 숫자를 리턴해 주세요.

▷ 입출력 예

stringInObject({
        a: 'hello',
        b: ['abc'],
        c: 'world',
        d: 100,
        e: false
      }) // 2

      const obj = {
        a: 1,
        b: 2,
        c: 3
      }

      stringInObject(obj)

▷ 내 풀이

function stringsInObject(obj) {
    // 여기에서 작업하세요.
    let answer = 0;
    obj = Object.values(obj);
    for (let i = 0; i < obj.length; i++) {
        if (typeof obj[i] === "string") {
            answer++;
        }
    }
    return answer;
}
  • 1, 2번 문제에 비해서 3, 4번 문제는 쉬워서 빨리 풀 수 있었다.

▷ for-in문 사용 풀이

function stringsInObject(obj) {
  // 여기에서 작업하세요.
  let count = 0;
  for (let key in obj) {
    if (typeof obj[key] === 'string') {
      count++;
    }
  }
  return count;
}

▷ Object.keys, filter매서드 사용 풀이

function stringsInObject(obj) {
  // 여기에서 작업하세요.
  const objKeys = Object.keys(obj).filter((key) => {
    return typeof obj[key] === 'string';
  });
  return objKeys.length;
}

▷ Object.keys, reduce매서드 사용 풀이

function stringsInObject(obj) {
  // 여기에서 작업하세요.
  return Object.keys(obj).reduce((acc, cur) => {
    return acc + (typeof obj[cur] === 'string' ? 1 : 0);
  }, 0);
}

📝 4. 직각삼각형 ( triangle )


  • 함수 triangle에 세변의 길이(a, b, c)가 주어집니다.
  • a의 제곱 + b의 제곱이 c의 제곱이면 직각 삼각형입니다.
  • 삼각형이 직각삼각형이라면 "right", 아니라면 "wrong"을 리턴하세요.

▷ 입출력 예

triangle(3, 4, 5) // 'right'

▷ 내 풀이

function triangle(a, b, c) {
    // 여기에서 작업하세요.
    let answer = "";
    if (a ** 2 + b ** 2 === c ** 2) {
        answer = "right";
    } else {
        answer = "wrong";
    }
    return answer;
}

▷ 삼항 연산자 사용 풀이

function triangle(a, b, c) {
 // 여기에서 작업하세요.
 return a * a + b * b === c * c ? 'right' : 'wrong';
}

출처: 코드캠프

profile
개발자 블로그 / 항상 겸손한 자세로 배우면서 성장하자 할 수 있다!

0개의 댓글