1. ๋ฌธ์ ์ ๋ํ์ฌ ๐ฆ
(1) ์กฐ๊ฑด ๋ถ์ ๐
Job์ ์์๋ก๋,์์ ์ ๋ฒํธ,์์ ์ ์์ฒญ ์๊ฐ,์์ ์ ์์ ์๊ฐ์ด ์๋ค.Job์ ๋งค ์ด๋ง๋ค, ๋๊ธฐํ์ ์ ์ฌ๋๋ค.- ๋๊ธฐํ๋ ๋ค์๊ณผ ๊ฐ์ ์ฝ์์ผ๋ก ๋ด๋ถ ์ฐ์ ์์๊ฐ ์ ํด์ง๋ค.
- ์์ ์๊ฐ์ด ์งง์์๋ก ์ฐ์ ์์๊ฐ ๋๋ค.
- ์์ ์๊ฐ์ด ๊ฐ๋ค๋ฉด ์์ฒญ ์๊ฐ์ด ๋น ๋ฅผ์๋ก ์ฐ์ ์์๊ฐ ๋๋ค.
- ์์์๊ฐ, ์์ฒญ์๊ฐ์ด ๊ฐ๋ค๋ฉด, ์์ ๋ฒํธ๊ฐ ์์์๋ก ์ฐ์ ์์๊ฐ ๋๋ค.
- ๋์คํฌ๋ ํ๋์ ์ผ์ ๊ทธ๊ฒ์ ์์์๊ฐ๋งํผ ํด๋ธ๋ค.
์ด๋, ์์์ ์์ ์ด ๊ทธ๊ฒ์ ์์ฒญ์๊ฐ๋ถํฐ ๋๋ ๋๊น์ง ๊ฑธ๋ฆฐ ์๊ฐ์ a๋ผ๊ณ ํ์ ๋, ๋ชจ๋ ์์ ์ a์ ํ๊ท ์ ๊ตฌํ๋ผ.
2. ์ฝ๋๊ฐ ๋์ค๊ธฐ๊น์ง ๐ ๏ธ
KEY WORD: ์ฐ์ ์์ ํ, ์๋ฎฌ๋ ์ด์
๋ฌธ์ ์์ ์ ์ํ ์กฐ๊ฑด์ ๊ตฌํํ๋ฉด ๋๋ค.
ํ์๋ ์ด๋ฅผ ์ํด ์ฐ์ ์์ ํ๋ฅผ ์ฌ์ฉํ๋ค. Job์ ๊ฒฝ์ฐ ๊ฐ์ฒด ๊ตฌํ์ด ์ฌ์ ์ง๋ง, ๋ฌธ์ ๋ ๋์คํฌ์ ์์ง์์ ์ด๋ป๊ฒ ํํํ ๊ฒ์ธ๊ฐ์ ๋ํ ๊ฒ์ด์๋ค. ํ์๋ ์ด ๋ํ ํด๋์ค ๊ฐ์ฒด๋ก ๋ง๋ค์ด ๊ตฌํํ๋ค.
(1) ์๊ฐ๋ณต์ก๋ ๋ถ์ โณ
์ฒ์ ๋ฌธ์ ํ์ด๋ฅผ ์๊ฐ์ด๊ณผ ๋ง์๋๋ฐ, ์ด์ ๋ ์๊ฐ๋จ์๋ก ๋ฌธ์ ๋ฅผ ํ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ ๋ถํ์ํ ์ฐ์ฐ ํ์๋ฅผ ์ฆ๊ฐ์์ผ์ ์๊ฐ ์ด๊ณผ๋ฅผ ๋ธ๋ค.
Job์ ๊ธธ์ด๊ฐ 500, ์์ฒญ ์์ ์ ์ต๋ 1,000์ด, ์์์๊ฐ ๋ํ 1,000์ด์ธ๋ฐ, ๋ง์ฝ์ 500๊ฐ์ ์์ฒญ์ด ๋ชจ๋ 1,000์ด๋ถํฐ ์์ํ๊ณ , ์์ ์๊ฐ๋ 1,000์ด๋ผ๊ณ ๊ฐ์ ํด๋ณด์. ๊ทธ๋ฌ๋ฉด 1,000 ์ด ์ดํ๋ถํฐ 500๊ฐ์ ์์ฒญ์ 1,000์ด๋ง๋ค ํ๋์ฉ ์ฒ๋ฆฌํด์ผ ํ๋ค. ์ด๋ $1,000 + 500 \times 1,000 = 501,000$ ์ ์ฐ์ฐ ํ์๊ฐ ๋ ๋ค.
๋ด๋ถ ๊ณ์ฐ์ด ๋ ์์ผ๋ฏ๋ก, ์ด๋ ์๊ฐ ์ด๊ณผ๋ฅผ ๋ผ ํ๋ฅ ์ด ๋ง๋ค.
ํ์ง๋ง ์ด๋ฒคํธ ๊ธฐ๋ฐ์ผ๋ก ๋ฌธ์ ๋ฅผ ํผ๋ค๋ฉด, ์ธ๋ถ ๋ฐ๋ณต๋ฌธ์ $500$๋ฒ๋ง ๋ฐ๋ณตํ๋ฉด ๋๋ค. ์ด๊ฒ์ด ๊ฐ๋ฅํ ์ด์ ๋
- ์ผ๋ง๋ค ์์ ์๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ 1์ด์ฉ ๋ฐ๋ณต๋ฌธ ๋๋ฆฌ์ง ๋ง๊ณ , ๊ทธ ์ผ์ด ๋๋๋ ์์ ์ผ๋ก ์ด๋ ๊ฐ๋ฅ.
- ์ผ์ด ๋๋๋ ์์ ๋ณด๋ค ์์ ์์ ์ด ๋น ๋ฅธ ์ผ๋ค์ ํ ๋ฒ์ ํ์ ์ง์ด ๋ฃ์ด๋ ๊ณ์ฐ์ด ํ๋ฆฌ์ง ์์
๋๋ฌธ์ด๋ค.
3. ์ฝ๋ ๐
(1) SUDO CODE ๐ฌ
0. JOB์ ๋ํ ์ฐ์ ์์ ํ ๋ง๋ค๊ธฐ
1. ์ผ์ ์ฒ๋ฆฌํ๋ ๋์คํฌ ๊ฐ์ฒด ๋ง๋ค๊ธฐ. (ํ์ฌ ์์
์ค์ธ ์ผ์ ๋ฒํธ, ์ด ์ผ ์ํ ์๊ฐ, ๋๋ธ ์ผ ์, ํ์ฌ ๋งก์ ์ผ์ด ๋๋๋ ์๊ฐ) ์ ๋ด๊ณ ์์ด์ผ ํ๋ค.
2. ๋์คํฌ๊ฐ ๋๋ธ ์ผ ์๊ฐ ๋ชจ๋ ์ผ์ ๊ฐ์๊ฐ ๋ ๋๊น์ง ๋ค์ ๋ฐ๋ณต๋ฌธ์ ์ํํ๋ค.
1. ํ์ฌ ๋์คํฌ๊ฐ ๋งก์ ์ผ์ด ๋๋๋ ์์ ๋ณด๋ค ์ผ ์์ ์์ ์ด ๋น ๋ฅธ Job์ ํ์ ๋ฃ๊ธฐ
2. ๋์คํฌ๊ฐ ์ผ ์ค์ด๋ฉด ๋์ด๊ฐ๊ธฐ
3. ๋์คํฌ๊ฐ ์ผ ์ค์ด์ง๋ฏธ ์์ผ๋ฉด, ํ์์ ํ๋ ๊บผ๋ด์ ์์
, ๋์คํฌ ๊ฐ์ฒด ์
๋ฐ์ดํธ
(2) JAVA CODE โ
import java.util.*;
class Solution {
static class Job {
int i; // ๋ฒํธ
int t; // ์์ฒญ ์๊ฐ
int w; // ์์ ์๊ฐ
public Job (int i, int t, int w){
this.i = i;
this.t = t;
this.w = w;
}
@Override
public String toString(){
return "์ผ ๋ฒํธ: " + i + " ์์ฒญ ์๊ฐ:" + t + " ์์ ์๊ฐ:" + w;
}
}
static class Disk {
int iter; // ์์
๋๋ ์ง์์
int amount_work_time; // ์ผ ์ํ ์๊ฐ ์ด๋
int done_cnt; // ๋๋ธ ์ผ ์
int end; // ํ์ฌ ๋งก์ ์ผ์ด ๋๋๋ ์๊ฐ
public Disk () {
this.iter = 0;
this.amount_work_time = 0;
this.done_cnt = 0;
this.end = 0;
}
}
public int solution(int[][] jobs) {
PriorityQueue<Job> pq = new PriorityQueue<>((j1, j2)-> {
if(j1.t == j2.t && j1.w == j2.w) return j1.i - j2.i;
if(j1.w == j2.w) return j1.t - j2.t;
return j1.w - j2.w; });
Arrays.sort(jobs, (a,b) -> a[0] - b[0]);
Disk disk = new Disk();
while(disk.done_cnt < jobs.length){
while(disk.iter < jobs.length && disk.end >= jobs[disk.iter][0]) {
pq.add(new Job(disk.iter, jobs[disk.iter][0], jobs[disk.iter][1]));
disk.iter++;
}
if(pq.isEmpty()){ // 0ms ๋์ ์์
์ด ์๋ค.
if(disk.iter < jobs.length) disk.end = jobs[disk.iter][0];
}else {
Job now = pq.poll();
disk.amount_work_time += disk.end + now.w - now.t;
disk.end += now.w;
disk.done_cnt++;
System.out.println(disk.end + now.w - now.t);
}
}
return disk.amount_work_time/jobs.length;
}
}
4. ํธ๋ฌ๋ธ ์ํ or ๋ฐฐ์ด ์ ๐
(1) ์๊ฐ ๋จ์ ๋ฌธ์ ํ์ด vs ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋ฌธ์ ํ์ด
์ฒ์์ ์ด๋จ์ ๋ฐ๋ณต์ผ๋ก ๋ฌธ์ ๋ฅผ ํ์๋ค๊ฐ, ์๊ฐ์ด๊ณผ๋ฅผ ๋ง์ฃผํ๋ค.