앞으로 이곳에 내가 공부한 것들을 기록할 예정이다.
알고리즘 풀이부터 알고리즘을 풀기위해 무얼 공부했는지까지
그럼 시작하겠다.
배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.
예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면
1. array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
2. 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
3. 2에서 나온 배열의 3번째 숫자는 5입니다.
배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.입출력 예
function solution(array, commands) {
var answer = [];
var pocket = [];
var start = 0;
var end = 0;
for( let i=0; i<commands.length; i++){
start = commands[i][0]-1;
end = commands[i][1];
for(let j = start; j<end; j++)
pocket.push(array[j]);
pocket.sort(function(a,b){
return a-b;
});
answer.push(pocket[commands[i][2] - 1]);
pocket = [];
}
return answer;
}
우선 이 문제의 카테고리는 정렬이다.
정렬이란 레코드(정렬할 대상)를 키(정렬의 기준)의 순서로
재배열하는 알고리즘 구현 방식을 말한다.
이를 토대로 문제를 분석해보면 주어진 배열 array에서
배열 commands에 value로 주어지는 조건에 맞게 요소들을 추출하여(레코드)
오름차순(정렬의 기준)으로 재배열하면 되는 문제인 것으로 판단하였다.
필자는 commands의 조건에 맞게 배열 array에서 추출한 요소값들을
임시로 저장하고 정렬할 배열 pocket을 선언해주었고
추출할 시작지점과 끝지점을 가리킬 변수 start, end를 선언해주었다.
큰 for문에서 주어진 조건의 수만큼(commands.length) 반복문을
실행시키고 작은 for문에서 조건에 맞는 배열 array의 요소를 추출해
pocket에 넣어주었다 그리고 sort함수를 이용하여 오름차순으로 정리 후
정답을 기록할 배열 answer에 넣고 다음 조건을 실행시키기 위해
pocket을 초기화 시켜주었다.
해당 과정들을 반복 후 최종적으로 answer를 리턴해주었다.