๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค LV3] ๋””์Šคํฌ ์ปจํŠธ๋กค๋Ÿฌ(Heap, ํž™)

๋ฐ˜์‘ํ˜•
SMALL

๐Ÿง ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค 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

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

๐Ÿ’ก ๋ฌธ์ œ ํ’€์ด

์šฐ์„ ์ˆœ์œ„ ํ(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);
    }
}

 

โœจ ํฌ์ŠคํŒ…์„ ๋งˆ์น˜๋ฉฐ

์š”์ฒญ ์‹œ์ ์„ ๊ธฐ์ค€์œผ๋กœ ๋จผ์ € ์ •๋ ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋‚ด์ง€ ๋ชปํ–ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•๋งŒ ์ž˜ ๋– ์˜ฌ๋ ธ์œผ๋ฉด ๋‚˜๋จธ์ง€๋Š” ๋ฌด๋‚œํ•˜๊ฒŒ ํ’€์–ด๋ƒˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋ฐ˜์‘ํ˜•
LIST