문제 설명
배열 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입니다.
입출력 예
array | commands | return |
[1, 5, 2, 6, 3, 7, 4] | [[2, 5, 3], [4, 4, 1], [1, 7, 3]] | [5, 6, 3] |
입출력 예 설명
[1, 5, 2, 6, 3, 7, 4]를 2번째부터 5번째까지 자른 후 정렬합니다. [2, 3, 5, 6]의 세 번째 숫자는 5입니다.
[1, 5, 2, 6, 3, 7, 4]를 4번째부터 4번째까지 자른 후 정렬합니다. [6]의 첫 번째 숫자는 6입니다.
[1, 5, 2, 6, 3, 7, 4]를 1번째부터 7번째까지 자릅니다. [1, 2, 3, 4, 5, 6, 7]의 세 번째 숫자는 3입니다.
나의 풀이
function solution(array, commands) {
var answer = [];
commands.forEach((v,i)=>{
answer.push(array.slice(v[0]-1,v[1]).sort((a,b)=>a-b)[v[2]-1])
})
return answer;
}
풀이 전략
➡️ commands를 forEach()메서드로 순회하며 array를 원하는 인덱스만큼 slice() 해준 다음 sort하여 원하는 position인 v[2]-1 을 새로 선언한 answer배열에 push 해주었다.
(but, slice() 메소드는 끝인덱스 직전까지 반환하므로 끝 인덱스를 포함하려면 +1을 해주어야함)
v[0]-1 : 원하는 배열의 시작 인덱스
v[1]-1 : 원하는 배열의 끝 인덱스
v[2]-1 : 원하는 배열의 정렬 후의 반환할 값의 인덱스
참고
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]
})
}
구조 분해 할당을 사용한 const [sPosition, ePosition, position] = command 부분이 되게 직관적이고 가독성이 좋아 가져와봤다.
map 메소드 안에서 구조 분해 할당을 통해 command 에 있던 시작인덱스, 끝인덱스, 정렬 후 반환해야하는 인덱스를 넣고 newArray배열에 array에서 원하는 부분을 filter처리하고 sort하여 원하는 부분의 인덱스를 반환하였다.
review)
구조분해할당을 사용하여 명시적으로 배열의 원하는 부분을 표시한 것이 인상깊은 코드였다.
단순히 사용법만 알고 있는 것이 아니라 직접 코드에 자유자재로 활용할 수 있어야 하는 것 같다