이번엔 다소 간단한 문제이다. array가 주어지고 commands가 주어질 때 commands에 따라서 array안에 원소를 뽑아서 return한다. 예를 들어, commands = [1,3,1] arr = [1,2,3,4]
이라고 했을 때 arr에서 1~3번째 원소를 뽑은다음에 sort해서 1번째 원소를 뽑으면 된다. 즉 1이 뽑히게 된다.
접근 방법도 간단하다.
function mysolution(array, commands) {
var answer = [];
for (let i = 0; i < commands.length; i++) {
sortAndPick(commands[i][0], commands[i][1], commands[i][2]);
}
function sortAndPick(start, end, pick) {
let chosen = array.slice(start - 1, end).sort((a, b) => a - b)[pick - 1];
answer.push(chosen);
}
return answer;
}
상당히 직관적이다. 읽기 쉽다. 그러나 개발자라면 항상 질문해야한다. 여기서 개선할 수 있는 방법이 있을까? 다른 분의 답을 살펴보자
function otherSolution(array, commands) {
return commands.map((command) => {
const [sPos, ePos, pos] = command;
const newArray = array
.filter((v, i) => i >= sPos - 1 && i <= ePos - 1)
.sort((a, b) => a - b);
return newArray[pos - 1];
});
}
let array = [1, 5, 2, 6, 3, 7, 4];
let commands = [
[2, 5, 3],
[4, 4, 1],
[1, 7, 3],
];
// [5, 6, 3]
filter에서 index를 가지고도 filter 할 수 있는 줄은 몰랐다. 게다가 map안에서 filter한것도 흥미롭고 const를 packing한것도 깔끔하다. 잘 정리정돈된 방을 보는 느낌이다.