https://programmers.co.kr/learn/courses/30/lessons/42748
문제
배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.
예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면 array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
2에서 나온 배열의 3번째 숫자는 5입니다.
배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.
제한사항
array의 길이는 1 이상 100 이하입니다.
array의 각 원소는 1 이상 100 이하입니다.
commands의 길이는 1 이상 50 이하입니다.
commands의 각 원소는 길이가 3입니다.
function solution(array, commands) {
let newArray = [];
commands.map((itm)=>{
const sliced = array.slice(itm[0]-1,itm[1]).sort();
newArray.push(sliced[itm[2]-1]);
})
return newArray
}
테스트 결과
function solution(array, commands) {
let newArray = [];
for (const com of commands) {
const slicedArray = array.slice(com[0] - 1, com[1]).sort();
newArray.push(slicedArray[com[2] - 1]);
}
return newArray;
}
테스트 결과
map과 for문을 비교했을때 map이 훨씬 효율적으로 빨리 결과를 도출해냈다.
하지만 둘 다 1개의 테스트를 통과하지못했고, 혼자서는 원인을 찾지 못해서 검색을 통해 알아보았다.
원인은 sort의 문제.
나는 습관처럼 문자열이 아닌 숫자비교임에도 sort()로 배열을 배워둔 상태로 sorting을 시도했다.
sort함수는 비워놓은 상태로 사용하게되면 문자열로 변환하여 유니코드로 정렬을 한다.
따라서 숫자를 비교하기 위해서는 sort함수에 인자를 넣어서 오름차순을 위해서는 a-b를, 내림차순을 할때는 b-a로 리턴하도록 한다.
function solution(array, commands) {
let newArray = [];
commands.map((itm)=>{
const sliced = array.slice(itm[0]-1,itm[1]).sort((a,b)=>a-b);
newArray.push(sliced[itm[2]-1]);
})
return newArray
}
참조: https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/sort