문제
코드
function solution(array, commands) {
let answer = [];
for (let i = 0; i < commands.length; i++) {
const command = commands[i];
const startIdx = command[0] - 1;
const endIdx = command[1] - 1;
const pickIdx = command[2] - 1;
const sliceArray = array.map((item, idx) => {
if (startIdx <= idx && idx <= endIdx) {
return item
}
})
const sortedArray = sliceArray.sort();
answer.push(sortedArray[pickIdx])
}
return answer;
}
결과
왜 하나만 실패했을까..
수정 1
function solution(array, commands) {
let answer = [];
for (let i = 0; i < commands.length; i++) {
const command = commands[i];
const startIdx = command[0] - 1;
const endIdx = command[1] - 1;
const pickIdx = command[2] - 1;
// const sliceArray = array.map((item, idx) => {
// if (startIdx <= idx && idx <= endIdx) {
// return item
// }
// })
const sliceArray = array.slice(startIdx, endIdx + 1);
const sortedArray = sliceArray.sort();
answer.push(sortedArray[pickIdx])
}
return answer;
}
slice 부분을 직접 구현한 것이 잘못되었나 싶어서 메서드를 사용했는데 결과는 처음처럼 테스트2만 실패했다.
그럼 sort에 문제가 있는 것 같아서 찾아보니 sort()만 할 경우 아스키코드 순서대로 정렬하기 때문에 제대로 정렬이 되지 않는다고 한다. 예를 들어, [1, 2, 10] 배열을 sort() 할 경우 [1, 10, 2]가 된다. 따라서, 크기 순으로 정렬하려면 인자를 넣어줘야 한다.
수정2
function solution(array, commands) {
let answer = [];
for (let i = 0; i < commands.length; i++) {
const command = commands[i];
const startIdx = command[0] - 1;
const endIdx = command[1] - 1;
const pickIdx = command[2] - 1;
// const sliceArray = array.map((item, idx) => {
// if (startIdx <= idx && idx <= endIdx) {
// return item
// }
// })
const sliceArray = array.slice(startIdx, endIdx + 1);
const sortedArray = sliceArray.sort((a, b) => a - b);
answer.push(sortedArray[pickIdx])
}
return answer;
}
내림차순으로 정렬하려면 a - b를 b - a로 바꾸면 된다.
그리고 sort메서드는 정렬한 값을 반환하는 것이 아니라 원래 배열을 직접 정렬하기 때문에 굳이 다른 변수에 다시 넣어주지 않아도 된다.
// MDN
var numbers = [4, 2, 5, 1, 3];
numbers.sort(function(a, b) {
return a - b;
});
console.log(numbers);
// [1, 2, 3, 4, 5]
다른 사람의 풀이
function solution(array, commands) {
return commands.map(command => {
const [sPosition, ePosition, position] = command
const newArray = array
.filter((value, fIndex) => fIndex >= sPosition - 1 && fIndex <= ePosition - 1)
.sort((a,b) => a - b)
return newArray[position - 1]
})
}
우선 commands 자체를 map을 돌리면서 command를 조작해 결과값을 리턴한다.
그리고 구조 분해 할당으로 변수를 선언했고 filter와 sort를 이어서 적었다.
function solution(array, commands) {
return commands.map(command => {
const [sPos, ePos, goalPos] = command;
const newArray = array.slice(sPos - 1, ePos).sort((a, b) => a - b);
return newArray[goalPos - 1]
})
}
위의 코드처럼 filter 부분을 slice로 변경하니 더 깔끔해진 것 같다. (변수명도 나름 바꿈)
'자료구조와 알고리즘 > programmers' 카테고리의 다른 글
정렬 > 가장 큰 수 (0) | 2021.06.17 |
---|