Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 티스토리챌린지
- softeer
- 동적계획법
- join
- DP
- programmers
- javascript
- Java
- 깊이 우선 탐색
- C언어
- level 3
- select
- Dynamic Programming
- dfs
- 오블완
- bfs
- 프로그래머스
- LEVEL 2
- SQL 고득점 KIT
- Lv. 1
- SQL
- group by
- 소프티어
- 너비 우선 탐색
- Lv. 2
- 자바스크립트
- Lv. 0
- 파이썬
- Lv. 3
- Python
Archives
- Today
- Total
몸과 마음이 건전한 SW 개발자
프로그래머스 [Lv. 3] 야근 지수 {언어 : JavaScript} 본문
문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/12927
정답 코드
function solution(n, works) {
class heapq {
constructor() {
this.heap = [];
};
size() {
return this.heap.length;
};
swap(left, right) {
[this.heap[left], this.heap[right]] = [this.heap[right], this.heap[left]];
};
heappush(value) {
this.heap.push(value);
this.bubbleUp();
};
bubbleUp() {
let son = this.heap.length - 1;
let parent = Math.floor((son - 1) / 2);
while (parent >= 0 && this.heap[son] > this.heap[parent]) {
this.swap(son, parent);
son = parent;
parent = Math.floor((son - 1) / 2);
};
};
heappop() {
if (this.heap.length == 1) {
return this.heap.pop();
};
const value = this.heap[0];
this.heap[0] = this.heap.pop();
this.bubbleDown();
return value;
};
bubbleDown() {
let root = 0;
let left = 2 * root + 1;
let right = 2 * root + 2;
while (
(left < this.heap.length && this.heap[left] > this.heap[root]) ||
(right < this.heap.length && this.heap[right] > this.heap[root])
) {
let tmp = left;
if (right < this.heap.length && this.heap[right] > this.heap[tmp]) {
tmp = right;
};
this.swap(root, tmp);
root = tmp;
left = 2 * root + 1;
right = 2 * root + 2;
};
};
};
const maxHeap = new heapq();
works.forEach((e) => {
maxHeap.heappush(e);
})
let tmp = n;
while (tmp) {
const maxV = maxHeap.heappop();
if (maxV == 0) {
break
}
maxHeap.heappush(maxV-1);
tmp -= 1;
}
const answer = maxHeap.heap.reduce((res, e) => {
return res += e ** 2;
}, 0);
return answer;
}
풀이 방법
- 힙을 구현한다.
- 힙에 값을 넣고 힙정렬을 시킨다.
- heappop을 하면 가장 큰 값이 나오는데 -1을 해주고 tmp도 -1을 한다.
- 이 과정은 n이 0 즉, tmp가 0이 될 때까지 반복한다.
- heappop한 값이 0인 경우 종료 시켜도 좋을 것 같아서 수정했다.
- 이 과정은 n이 0 즉, tmp가 0이 될 때까지 반복한다.
- reduce함수를 이용해 제곱한 값을 더해서 반환한다.
느낀점
- heap을 직접적으로 코테에서 적용할 수 있는 실력이 될 때까지 공부해야겠다.
- 이론은 알지만 기억력이 딸리는 것 같다.
'알고리즘' 카테고리의 다른 글
프로그래머스 [Lv. 3] 등굣길 {언어 : JavaScript} (0) | 2024.03.25 |
---|---|
프로그래머스 [Lv. 3] 최고의 집합 {언어 : JavaScript} (0) | 2024.03.25 |
프로그래머스 [Lv. 3] 정수 삼각형 {언어 : JavaScript} (0) | 2024.03.25 |
프로그래머스 [Lv. 3] 여행경로 {언어 : JavaScript} (0) | 2024.03.19 |
프로그래머스 [Lv. 3] 아이템 줍기 {언어 : JavaScript} (0) | 2024.03.19 |