난이도 : Level. 1
언어 : Javascript
출제 내역 : 정렬
숫자 배열 중에서 주어진 조건에 따라 나오는 K번째 수를 반환하자
우선 이 문제는 여러가지 조건이 있습니다.
commands 인자에 들어오는 값이 만약 [2, 4, 2] 라면
array 배열에서 2번째부터 4번째 값까지 자르고
그 자른 값을 오름차순으로 정렬한 뒤, 2번째 값을 answer에 넣어라
라는 조건을 갖고 있습니다.
function solution(array, commands) {
var answer = [];
for(let i = 0; i<commands.length; i++) {
let sliceArr = array.slice(commands[i][0]-1,commands[i][1])
.sort((a,b) => a-b);
순서대로 뜯어본다면 우선, 반복문을 통해 commands의 배열 길이만큼 반복합니다.
그 후 slice
로 배열을 잘라주는데 인덱스 값이 아닌 몇번째인지를 판단해야 하기에
slice
의 첫번째에는 -1 을 해주고, 두번째는 그대로 설정합니다.
그 뒤, 잘라진 값을 sort
를 이용해 정렬해 줍니다.
sort
를 왜 이런 방식으로 했는지는 아래에서 정리하도록 하겠습니다.
answer.push(sliceArr[commands[i][2]-1]);
}
return answer;
}
정렬된 배열에서 K번째 숫자를 찾아내 그 수를 정답 배열에 넣어줍니다.
이러한 반복문 과정이 완료가 되면 답의 도출이 가능합니다.
자바스크립트의 sort 함수는 기본적으로 원소들을 문자열로 만든 뒤에,
UTF-16 코드 유닛 값을 기준으로 순서를 정렬합니다.
여기서 눈치 채신 분도 있겠지만 문자열로 바꾼 뒤에 정렬을 하기 때문에
숫자 정렬에 적합하지 않습니다.
- 출처 : sort에 관한 블로그 글
이 말인 즉슨, 유니코드로 기준을 잡아 숫자를 정렬하기 때문에
오름차순으로 하고 싶어도 낮은 숫자보다 높은 숫자가 앞으로 올 가능성이 있습니다.
그렇기 때문에 sort
함수에 위와 같은 작업을 해주어야
제대로 된 오름차순을 경험할 수 있습니다.
sort
함수를 몇 번 사용해 보긴 했지만 숫자 정렬에는 적합하지 않다는 것을
이제서야 알았기에, 그 부분을 다음부터 잘 고려해서 사용해야겠습니다.