๐ง ํ๋ก๊ทธ๋๋จธ์ค LV3. ๋์คํฌ ์ปจํธ๋กค๋ฌ
๋ฌธ์ ์ค๋ช
ํ๋๋์คํฌ๋ ํ ๋ฒ์ ํ๋์ ์์ ๋ง ์ํํ ์ ์์ต๋๋ค. ๋์คํฌ ์ปจํธ๋กค๋ฌ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ต๋๋ค. ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ ์์ฒญ์ด ๋ค์ด์จ ์์๋๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋๋ค.
๊ฐ ์์ ์ ๋ํด [์์ ์ด ์์ฒญ๋๋ ์์ , ์์ ์ ์์์๊ฐ]์ ๋ด์ 2์ฐจ์ ๋ฐฐ์ด jobs๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์์ ์ ์์ฒญ๋ถํฐ ์ข ๋ฃ๊น์ง ๊ฑธ๋ฆฐ ์๊ฐ์ ํ๊ท ์ ๊ฐ์ฅ ์ค์ด๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฒ๋ฆฌํ๋ฉด ํ๊ท ์ด ์ผ๋ง๊ฐ ๋๋์ง return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์. (๋จ, ์์์ ์ดํ์ ์๋ ๋ฒ๋ฆฝ๋๋ค)
์ ํ ์ฌํญ
- jobs์ ๊ธธ์ด๋ 1 ์ด์ 500 ์ดํ์ ๋๋ค.
- jobs์ ๊ฐ ํ์ ํ๋์ ์์ ์ ๋ํ [์์ ์ด ์์ฒญ๋๋ ์์ , ์์ ์ ์์์๊ฐ] ์ ๋๋ค.
- ๊ฐ ์์ ์ ๋ํด ์์ ์ด ์์ฒญ๋๋ ์๊ฐ์ 0 ์ด์ 1,000 ์ดํ์ ๋๋ค.
- ๊ฐ ์์ ์ ๋ํด ์์ ์ ์์์๊ฐ์ 1 ์ด์ 1,000 ์ดํ์ ๋๋ค.
- ํ๋๋์คํฌ๊ฐ ์์ ์ ์ํํ๊ณ ์์ง ์์ ๋์๋ ๋จผ์ ์์ฒญ์ด ๋ค์ด์จ ์์ ๋ถํฐ ์ฒ๋ฆฌํฉ๋๋ค.
์ ์ถ๋ ฅ ์
jobs | return |
[[0, 3], [1, 9], [2, 6]] | 9 |
https://school.programmers.co.kr/learn/courses/30/lessons/42627
๐ก ๋ฌธ์ ํ์ด
์ฐ์ ์์ ํ(Priority Queue)๋ฅผ ์ฌ์ฉํ๋ ๋ฌธ์ ์๋ค. ์ฒ๋ฆฌ ๊ฐ๋ฅํ ์์ฒญ ์ค์์ ์์ ์์ ์๊ฐ์ด ์งง์ ์์ฒญ์ ๊ธฐ์ค์ผ๋ก ํ์ ๋ฃ์๋ค ๋นผ๊ณ ๋ฅผ ๋ฐ๋ณตํ๋ ๊ณ์ํด์ ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋ค. ์ฐพ์๋ณด๋ ์์ฒญ ์์ ์ ๊ธฐ์ค์ผ๋ก ๋จผ์ ๋ฐฐ์ด์ ์ ๋ ฌํ๊ณ , ์ฒ๋ฆฌ ๊ฐ๋ฅํ ์์ฒญ๋ค์ ํ๋์ฉ ํ์ ์ฝ์ ํด์ฃผ๋ ๋ฐฉ๋ฒ์ผ๋ก ํ ์ ์์๋ค.
๋จผ์ ํ์ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ์ ๋ฐ ์ด๊ธฐํํ๋ค.
// ์์ฒญ ์์ ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ
Arrays.sort(jobs, (o1, o2) -> o1[0] - o2[0]);
// ์์ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ฐ์ ์์ ํ ์ด๊ธฐํ
Queue<int[]> pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]);
int count = 0; // ์ฒ๋ฆฌํ ์์ฒญ ์
int index = 0; // ํ์ ์ฝ์
ํ jobs ๋ฐฐ์ด ์ธ๋ฑ์ค ์์น ์ ์ฅ
int time = 0; // ํ์์
int answer = 0; // ์ฒ๋ฆฌํ ์์ฒญ์ ๋ํด์ (ํ์์ - ์์ฒญ ์์ ) ๊ฐ์ ํฉ
์์ฒญ์ ํ๋์ฉ ํ๋จํด์ ํ์์ ์ ๊ฐ๋ฅํ ์์ฒญ๋ถํฐ ํ์ ์ฝ์ ํ๊ณ , ๊ทธ ์ค ์์์๊ฐ์ด ์งง์ ์์ฒญ๋ถํฐ ์ฒ๋ฆฌํ๋ค.
์ด ๊ณผ์ ์ ๋ชจ๋ ์์ฒญ์ด ์ฒ๋ฆฌ๋ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
while(count < jobs.length) {
// ์ฒ๋ฆฌ ๊ฐ๋ฅํ ์์ฒญ ์ถ๊ฐ
while (index < jobs.length && jobs[index][0] <= time) {
pq.add(jobs[index++]);
}
if (pq.isEmpty()) time = jobs[index][0]; // ํ์์ ์
๋ฐ์ดํธ
else { // ์ฒ๋ฆฌ ๊ฐ๋ฅํ ์์ฒญ์ด ์์ ๋
int[] job = pq.poll(); // ์์์๊ฐ์ด ๊ฐ์ฅ ์งง์ ์์ฒญ๋ถํฐ ์ฒ๋ฆฌ
time += job[1]; // ํ์์ ์
๋ฐ์ดํธ
answer += time - job[0]; // ์์ฒญ ์ฒ๋ฆฌ ์๊ฐ ์
๋ฐ์ดํธ
count++; // ์์ฒญ ์ฒ๋ฆฌ ์ ์ฆ๊ฐ
}
}
ํ์ ์ฝ์ ํ์ง ์์ ์์ฒญ(index < jobs.length)์ด๊ณ , ํ์์ ์ ์ฒ๋ฆฌ ๊ฐ๋ฅํ ์์ฒญ(jobs[index][0] <= time)์ด๋ฉด ํ์ ์ฝ์ ํ๋ค.
์ด์ ํ์์ ์์์๊ฐ์ด ๊ฐ์ฅ ์งง์ ์์ฒญ ํ๋๋ฅผ ๊บผ๋ด์ ์ฒ๋ฆฌํ๋ค.
ํ์ง๋ง ํ๊ฐ ๋น์ด์๋ค๋ฉด, ์์ง ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋ ์์ ์ด ์๋๋ฏ๋ก, ์์ฒญ ์์ ์ด ๊ฐ์ฅ ์ต๊ทผ์ธ ๊ฐ์ผ๋ก ํ ์์ ์ ์ ๋ฐ์ดํธํ๋ค.
ํ๊ฐ ๋น์ด์์ง ์๋ค๋ฉด, ์ฆ ์ฒ๋ฆฌ ๊ฐ๋ฅํ ์์ฒญ์ด ์๋ค๋ฉด, ํ๋ ๊บผ๋ด์ ์์์๊ฐ๋งํผ ํ์์ ์ ์ ๋ฐ์ดํธ ํด์ฃผ๊ณ , ํด๋น ์์ฒญ์ ์ฒ๋ฆฌ ์๊ฐ๋ ์ ๋ฐ์ดํธ, ์์ฒญ์ ํ๋ ์ฒ๋ฆฌํ์ผ๋ฏ๋ก ์์ฒญ ์ฒ๋ฆฌ ์ ๊ฐ๋ 1๋งํผ ์ ๋ฐ์ดํธํ๋ค.
์ ๊ณผ์ ์ด ๋๋ ํ, ๋ชจ๋ ์์ฒญ ์ฒ๋ฆฌ ์๊ฐ์ ํฉ์ ํ๊ท ๊ฐ์ ๊ตฌํ๋ฉด ๋๋ค.
์ด ๋ฐฉ์์ ์ ์ฒด ์ฝ๋๋ก ํ์ด๋ด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
import java.util.*;
class Solution {
public int solution(int[][] jobs) {
Arrays.sort(jobs, (o1, o2) -> o1[0] - o2[0]); // ์์ฒญ ๊ธฐ์ค ์ ๋ ฌ
Queue<int[]> pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]); // ์์์๊ฐ ๊ธฐ์ค
int count = 0, index = 0, time = 0, answer = 0;
while(count < jobs.length) {
while (index < jobs.length && jobs[index][0] <= time) {
pq.add(jobs[index++]);
}
if (pq.isEmpty()) time = jobs[index][0];
else {
int[] job = pq.poll();
time += job[1];
answer += time - job[0];
count++;
}
}
return (int) Math.floor(answer / jobs.length);
}
}
โจ ํฌ์คํ ์ ๋ง์น๋ฉฐ
์์ฒญ ์์ ์ ๊ธฐ์ค์ผ๋ก ๋จผ์ ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋ด์ง ๋ชปํ๋ค. ์ด ๋ฐฉ๋ฒ๋ง ์ ๋ ์ฌ๋ ธ์ผ๋ฉด ๋๋จธ์ง๋ ๋ฌด๋ํ๊ฒ ํ์ด๋์ ๊ฒ ๊ฐ๋ค.
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค LV3] 110 ์ฎ๊ธฐ๊ธฐ (Stack, ์คํ) (0) | 2023.10.20 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค LV2] ์์ ์ฐพ๊ธฐ (์์ ํ์, ์์, ์กฐํฉ) (0) | 2023.10.19 |
[ํ๋ก๊ทธ๋๋จธ์ค LV2] ๋ค๋ฆฌ๋ฅผ ์ง๋๋ ํธ๋ญ(Queue, ํ) (2) | 2023.10.17 |
[ํ๋ก๊ทธ๋๋จธ์ค LV2] ๊ธฐ๋ฅ๊ฐ๋ฐ (Queue, ํ) (0) | 2023.10.17 |
[๋ฐฑ์ค 1162] ๋๋กํฌ์ฅ (Dijkstra, ๋ค์ต์คํธ๋ผ) (2) | 2023.10.16 |