프로그래머스 > 코딩테스트 > 정렬 > K번째 수

hyeonyohwan·2021년 4월 8일
0

function solution(array, commands) {
    var answer = [];
    for(var i = 0; i < commands.length; i++){
        var temp = array.slice(commands[i][0]-1, commands[i][1]);
        temp.sort(function(a,b){
          return a-b;
        });
        answer[i] = temp[commands[i][2]-1];
    }
    
    return answer;
}

slice()는 만약 1부터 3까지면 slice(1, 4)로 쓰면 된다.
이 문제에서 sort()를 그냥 사용했더니 테스트 케이스 하나에서 끊임없이 오류가 발생하였다.
원인을 찾아보니 sort()arr.sort([compareFunction])
compareFunction 이라고 한다.

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

compareFunction이 제공되면 배열 요소는 compare 함수의 반환 값에 따라 정렬됩니다. a와 b가 비교되는 두 요소라면,
compareFunction(a, b)이 0보다 작은 경우 a를 b보다 낮은 색인으로 정렬합니다. 즉, a가 먼저옵니다.
compareFunction(a, b)이 0을 반환하면 a와 b를 서로에 대해 변경하지 않고 모든 다른 요소에 대해 정렬합니다. 참고 : ECMAscript 표준은 이러한 동작을 보장하지 않으므로 모든 브라우저(예 : Mozilla 버전은 적어도 2003 년 이후 버전 임)가 이를 존중하지는 않습니다.
compareFunction(a, b)이 0보다 큰 경우, b를 a보다 낮은 인덱스로 소트합니다.
compareFunction(a, b)은 요소 a와 b의 특정 쌍이 두 개의 인수로 주어질 때 항상 동일한 값을 반환해야합니다. 일치하지 않는 결과가 반환되면 정렬 순서는 정의되지 않습니다.

그러므로 오름차순으로 정렬하고 싶다면
arr.sort((뒤의 값, 앞의 값) => 뒤의 값 - 앞의 값)와 같이 작성하면 된다. 앞의 값이 더 클 때만 음수가 나오므로 앞의 값이 더 클 때 변경이 일어나니까 뒤에 있는 큰 값이 다 앞으로 오게 돼서 오름차순 정렬이 된다.
arr.sort((a, b) => a - b; // 옆에처럼 사용

내림차순으로 정렬하고 싶다면
arr.sort((뒤의 값, 앞의 값) => 앞의 값 - 뒤의 값)와 같이 작성하면 됩니다. 뒤의 값이 더 클 때만 음수가 나오므로 뒤의 값이 클 때 변경이 일어나니까 뒤에 있는 큰 값이 뒤로 가게 되고 작은 값은 앞으로 오게 돼서 내림차순 정렬이 된다.
arr.sort((a, b) => b - a; // 옆에처럼 사용

참고 - https://velog.io/@jakeseo_me/Javascript-Sort%ED%95%A8%EC%88%98%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9E%A1%EC%A7%80%EC%8B%9D // https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/slice

profile
웹 프론트엔드 개발자입니다.

0개의 댓글