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 |
Tags
- TypeScript 문법 소개
- 프로그래머스 데브코스 프론트엔드
- 프로그래머스 K_Digital Training
- frontend roadmap study
- useEffect return
- 인프런 자바스크립트 알고리즘 문제풀이
- 모던 자바스크립트 TIL
- KDT 프로그래머스
- react 프로젝트 리팩토링
- KDT 프로그래머스 데브코스 프론트엔드
- react customHook 예시
- Vue3
- 투포인터알고리즘 js
- Frontend Roadmap
- 프로그래머스 데브코스 프론트엔드 TIL
- 백준 node.js
- 모던 자바스크립트 Deep Dive TIL
- 우테캠 회고록
- 모던 자바스크립트 Deep Dive
- 프로그래머스 K_Digital Training 프론트엔드
- 프로그래머스 데브코스
- 백준 js
- 모던 자바스크립트 딥다이브
- K_Digital Training
- useRef 지역 변수
- Vue3 Router
- 모던 javascript Deep Dive
- 개발자 특강
- 리팩토링 회고
- 머쓱이
Archives
- Today
- Total
프론트엔드 개발자의 기록 공간
[백준 node.js] 1202번_보석 도둑 본문
백준 그리디 알고리즘 1202번_보석 도둑
난이도 : 골드IV
해결못한 문제 : 시간 초과 or 메모리 초과
문제 설명
입출력
예제 입력2
4 4
1 100
2 200
13 300
10 500
10
10
10
14
=> 답 : 1100
문제 풀이 : 최대한 비싼 보석을 챙기는 것이 문제 핵심이다. 그러기 위해서는 제일 비싼 보석을 순차적으로 보석의 무게와 비슷한 가방을 찾아 넣어줘야한다. 만약 1kg짜리 보석을 10kg짜리 가방에 넣으면 비효율적이기 때문에 최대한 비슷한 가방을 찾아서 넣어야한다. 정리하면 다음과 같다.
1. 보석 가격을 기준으로 정렬을 해준다.
2. 가방은 오름차순 정렬을 시행해준다.
3. 가격이 높은 보석을 차례대로 보석 무게와 비슷한 가방을 찾아서 넣어준다(보석 가격 누적계산)
*우선순위 큐를 구현하여 사용한 예제
//우선순위 큐
class PriorityQueue {
constructor() {
this.store = [];
}
//무게와 가격을 받아서 배열에 넣어준다.
enqueue(name, score) {
this.store.push([name, score]);
}
//제일 큰 값을 리턴
dequeue() {
let entry = 0;
this.store.forEach((item, index) => {
if (this.store[entry][1] < this.store[index][1]) {
entry = index;
}
});
return this.store.splice(entry, 1);
}
}
const solution = (k, priorityQueue, bag) => {
let cnt = 0;
//가방 개수 만큼
for (let i = 0; i < k; i++) {
//우선순위 큐에서 제일 큰 보석정보 가져옴
let value = priorityQueue.dequeue();
//가방을 순회하면서 보석 무게보다 크거가 같은 경우는 그 보석을 담았다고 가정하고
//담은 가방을 제외한 가방을 리턴함
bag = bag.map((el, index) => {
if (el >= value[0][0]) {
return;
} else {
return el;
}
});
cnt += value[0][1];
}
console.log(cnt);
};
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
let input = [];
rl.on("line", function (line) {
//여러줄 입력
input.push(line);
}).on("close", function () {
let [n, k] = input
.shift()
.split(" ")
.map((el) => Number(el));
//우선순위 큐 생성
const priorityQueue = new PriorityQueue();
for (let i = 0; i < n; i++) {
let [x, y] = input[i].split(" ").map((el) => Number(el));
//우선순위 큐에 보석 무게, 가격 담아줌
priorityQueue.enqueue(x, y);
}
let bag = [];
//가방넣어줌
for (let j = 0; j < k; j++) {
bag.push(Number(input[j]));
}
//가방 오름차순정렬
bag = bag.sort((a, b) => a - b);
solution(k, priorityQueue, bag);
process.exit();
});
* 문제 난이도가 높아질수록 우선순위 큐, 힙, 등등 자료구조를 이용해야지만 해결해야하는 문제들이 많아지는데
이 문제 또한 우선순위 큐라는 자료구조를 이용해야지만 정답처리를 받을 수 있다. JS에서는 기본적인 자료구조가 제공되지 않아 우선순위 큐를 구현도 해보고 이런저런 시도를 통해 해결할려고 했지만 실패했다. (엄청난 실력자라면 가능할지라도 저는 실패했습니다.) JS는 다른언어들에 비해 자료구조가 한없이 부족한것 같다. 파이썬 처럼 모듈을 불러와 메소드처럼 사용할 수 있다면 얼마나 좋을까...
728x90
'알고리즘_JS > 백준_Greedy' 카테고리의 다른 글
[백준 node.js] 1715번_카드 정렬하기 (0) | 2021.01.18 |
---|---|
[백준 node.js] 2847번_게임을 만든 동준이 (0) | 2021.01.17 |
[백준 node.js] 1339번_단어 수학 (0) | 2020.12.30 |
[백준 node.js] 1449번_수리공 항승 (2) | 2020.12.29 |
[백준 node.js] 1783번_병든 나이트 (0) | 2020.12.29 |
Comments