[프로그래머스] K번째 수 (JavaScript)
알고리즘 문제풀이 [프로그래머스] K번째 수 (JavaScript)
프로그래머스 Level 1 - K번째수
- 문제 분류:
정렬
- 문제 출처: 프로그래머스 Level 1 - K번째수
- 라벨:
Level 1
,JavaScript
문제
commands 배열은 [i, j, k] 형태의 원소를 가지는 2차원 배열이다. 1차원 배열 array에 대해 commands의 모든 각각의 원소를 적용해야 한다.
- array의 i번째부터 j번째까지 자른다.
1번
에서 나온 배열을 정렬한다.2번
에서 나온 (정렬된) 배열에서 k번째 숫자를 찾는다.- 이렇게 commands를 돌며
3번
에서 나온 숫자들을 배열에 담아 최종적으로 리턴한다.
풀이1
- commands 배열을
forEach
로 순회하며 아래 과정을 반복한다. slice()
함수를 이용해 array를 자른다.- 잘린 배열(
slicing
)을sort()
로 정렬한다. - 잘린 배열(
slicing
)에서 k번째 수를 찾아 정답 배열(answer
)에 넣는다.
🏷️ Syntax
Array.prototype.sort()
- 그냥
sort()
는 배열의 요소들을 아스키 코드 순서대로 정렬한다.([100, 1, 4, 13,10]
을[1, 10, 100, 13,4]
으로 정렬한다. -> 원하는 결과X)sort(function(a, b){ return a - b; });
와 같이 작성해야 숫자를 오름차순으로 정렬할 수 있다.- 참고: 자바스크립트 정렬 함수, sort()
- 구조 분해 할당(Destructuring Assignment)
- ex)
[a, b] = [10, 20];
- 참고: 구조 분해 할당 - MDN
풀이1 코드
function solution(array, commands) {
let answer = [];
commands.forEach((command) => {
const slicing = array.slice(command[0] - 1, command[1]); // array의 i ~ j번째까지 잘라 새로운 배열에 저장
slicing.sort((a, b) => a - b); // 정렬
answer.push(slicing[command[2] - 1]);
});
return answer;
}
- 시간 복잡도: O(n^2) 보다 클 것으로 예상
- 반복문 안에서
sort()
실행하므로
- 반복문 안에서
💡
sort()
의 시간 복잡도
- 자바스크립트의
sort()
메서드가 호출될 때 어떤 정렬 알고리즘을 사용하는지는 JS엔진에 따라 달라질 수 있다고 한다.- Chrome, Firefox의 경우
sort()
는O(n log n)
의 시간복잡도를 갖는다고 한다.
풀이2
풀이1의 코드를 간단하게 바꿨다.
풀이2 코드
function solution(array, commands) {
return commands.map(
([i, j, k]) => array.slice(i - 1, j).sort((a, b) => a - b)[k - 1]
);
}
- 시간 복잡도: 풀이1과 동일. O(n^2)보다 클 것으로 예상
풀이3
- 정렬 알고리즘 중에서 버블 정렬을 사용해 문제를 풀었다.
- 버블 정렬 개선: 이미 정렬되어 있는 배열의 경우 반복문을 빨리 벗어날 수 있도록 코드를 작성했다.(
exchg
변수 관련)
풀이3 코드
function bubbleSort(arr) {
for (let i = 1; i < arr.length; i++) {
let exchg = 0;
for (let j = 0; j < arr.length - 1; j++) {
if (arr[j] > arr[j + 1]) {
const temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
exchg++;
}
}
if (!exchg) break;
}
return arr;
}
function solution(array, commands) {
let answer = [];
answer = commands.map(([i, j, k]) => {
const slicing = bubbleSort(array.slice(i - 1, j));
return slicing[k - 1];
});
return answer;
}
- 시간 복잡도: O(n^3)
map
반복 안에서 이중 for문이 실행되므로
- 이 풀이의 경우
sort()
를 사용했을 때보다 시간이 좀 더 걸리는 것을 알 수 있다.