처음에는 먼저 입력받는 매개변수 array
에서 매개변수 commands
의 각 배열 요소들의
인덱스 0번~1번에 해당하는 구간을 .slice()
메소드를 통해 떼어내준 뒤,
.sort()
메소드를 활용하여 떼어낸 요소들을 오름차순으로 정렬한 후, 해당 배열 요소에서 매개변수 commands
의 인덱스 2번 숫자에 해당하는 요소를 추출하여 answer라는 배열에 차례대로 하나씩 넣어주는 방법을 사용하여 문제를 풀었다.
먼저 맨 초반에 작성한 풀이이다.
const solution = (array, commands) => {
let first = array // 첫번째 인덱스
// 1. 매개변수 commands의 0번째~ 1번째 수의 구간만큼 새로운 배열 생성
.slice(commands[0][0] - 1, commands[0][1])
// 2. 생성된 배열을 오름차순 정렬 후 commands의 2번째 인덱스 수에 해당하는 인덴스값 추출, 변수 first에 할당.
.sort((a, b) => a - b)[commands[0][2] - 1];
// 2번 더 반복
let second = array // 두번째 인덱스
.slice(commands[1][0] - 1, commands[1][1])
.sort((a, b) => a - b)[commands[1][2] - 1];
let third = array // 세번째 인덱스
.slice(commands[2][0] - 1, commands[2][1])
.sort((a, b) => a - b)[commands[2][2] - 1];
console.log([first, second, third]); // 추출된 값을 차례대로 배열로 지정 및 출력.
};
직관적으로 나타내기 위해서 초반에는 first
, second
,third
라는 변수를 할당하여 함수 자체가 정상적으로 동작하는지 확인해보았다.
...??? 뭐지 출력 나오는데 왜 undefined인가..
이게 무슨 일인가 싶어 혹시나 하는 마음에
console.log([first, second, third]);
해당 코드를 console.log()
가 아닌 return
키워드로 변경하여 값을 반환하도록 해보았다.
역시 예상이 맞았다...
하나에 문제를, 둘에 똑바로 읽자
어쨋거나 문제는 해결했지만, 코드에서 반복되는 요소가 많아 반복문을 사용하여 코드의 길이를 한번 줄여보도록 하겠다.
// 기존 작성했던 solution함수.
const solution = (array, commands) => {
let first = array // 첫번째 인덱스
// 1. 매개변수 commands의 0번째~ 1번째 수의 구간만큼 새로운 배열 생성
.slice(commands[0][0] - 1, commands[0][1])
// 2. 생성된 배열을 오름차순 정렬 후 commands의 세번째 인덱스 수에 해당하는 인덴스값 추출, 변수 first에 할당.
.sort((a, b) => a - b)[commands[0][2] - 1];
// 2번 더 반복
let second = array // 두번째 인덱스
.slice(commands[1][0] - 1, commands[1][1])
.sort((a, b) => a - b)[commands[1][2] - 1];
let third = array // 세번째 인덱스
.slice(commands[2][0] - 1, commands[2][1])
.sort((a, b) => a - b)[commands[2][2] - 1];
return [first, second, third]; // 추출된 값을 차례대로 배열로 지정 및 출력.
};
/* =================================================================================== */
// 같은 기능을 수행하는 좀 더 짧은 코드.
const solution = (array, commands) => {
let answer = []; // return할 answer변수에 빈 배열 할당.
for (let i = 0; i < commands.length; i++) {
answer.push(array // answer[i] = array~ 와 같은 역할 수행!
.slice(commands[i][0] - 1, commands[i][1])
.sort((a, b) => a - b)[commands[i][2] - 1]);
}
return answer;
};
저번보다도 더 다양한 메소드 기능을 활용하여 문제를 해결했다!
내가 실행한 풀이에서 보면 .slice()
메소드 안에서 매개변수commands
의 배열 요소를 활용하기 위하여 commands[i][0] - 1, commands[i][1]
와 같이 코드를 구성했는데, commands
배열의 각 요소를 .map()
메소드로 변환하여 처리할 수 있다.
const solution = (array, commands) => {
return commands.map(command => { // map 메소드를 활용, commands의 배열 각 요소를 변환하여 처리.
const [start, end, k] = command; // command로 받은 배열의 각 인덱스값을 변수에 할당.
const slicedArray = array.slice(start - 1, end); // array에서 해당 구간 배열을 추출.
const sortedArray = slicedArray.sort((a, b) => a - b); // 오름차순 정렬하여 저장.
return sortedArray[k - 1]; // 정렬된 값에서 인덱스번호 (K - 1)의 값을 리턴.
});
};