[프로그래머스] Lv1. K 번째수

💻 문제

문제설명

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.

예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면

  1. array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
  2. 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
  3. 2에서 나온 배열의 3번째 숫자는 5입니다.

배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항

  • array의 길이는 1 이상 100 이하입니다.
  • array의 각 원소는 1 이상 100 이하입니다.
  • commands의 길이는 1 이상 50 이하입니다.
  • commands의 각 원소는 길이가 3입니다.

입출력 예

👆풀이방법

답안

성공 case

function solution(array, commands) {
    let result = [];
    for(const command of commands) {
        let arr = array.slice(command[0]-1, command[1]);
        arr.sort((o1, o2) => o1 - o2);
        result.push(arr[command[2]-1]);
    }
    return result;
}

실패 case

function solution(array, commands) {
    let result = [];
    for(const command of commands) {
        let arr = array.slice(command[0]-1, command[1]);
        arr.sort();
        result.push(arr[command[2]-1]);
    }
    return result;
}

실패 원인 파악

😫 실수했던 부분 😫
처음 답안을 제출했을 때 두번째 케이스에서만 계속 실패가 떴다.
이유는 arr.sort((o1, o2) => o1 - o2); 대신 arr.sort(); 를 사용했기 때문이였다,,,;;

sort API 문서를 보면 sort(compareFunction) 이 옵션으로 설정되어있는 것을 볼 수 있는데 유니코드 순서상 숫자는 크기대로 정렬이 될 수 없다. 예를 들면
[1,2,10] 의 경우 sort()로 정렬하면 [1,10,2] 로 결과 값이 나온다. 2보다 10의 순서가 우선시 되기 때문이다.
따라서 숫자정렬을 제대로 사용하려면 compareFunction을 사용해 정렬해야한다!

참고
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

compareFunction이 제공되지 않으면 요소를 문자열로 변환하고 유니 코드 코드 포인트 순서로 문자열을 비교하여 정렬됩니다. 예를 들어 "바나나"는 "체리"앞에옵니다. 숫자 정렬에서는 9가 80보다 앞에 오지만 숫자는 문자열로 변환되기 때문에 "80"은 유니 코드 순서에서 "9"앞에옵니다.

좋은 웹페이지 즐겨찾기