๋ฌธ์ ๋งํฌ
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
8๋ฒ, 18๋ฒ ํ ์คํธ์ผ์ด์ค์์ ์๊พธ ํ๋ ค์ ๊ณ ์ํ๋ค๐ฅฒ
ํ์ด
ํ๊ท ๋๊ธฐ ์๊ฐ์ ์ต์ํํ๋ ๋ฌธ์ ์๋ค. ์ค์ผ์ค๋ง ์๊ณ ๋ฆฌ์ฆ์ ๊ธฐ์ตํ๋ ์ฌ๋์ด๋ผ๋ฉด ๋จ๋ฒ์ SJF(Shortest Job First) ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๋ ๊ฑธ ์์์ฑ ์ ์๋ค. (์ฆ๋ช ์ ์ด ํฌ์คํ ์์ ๋ค๋ฃฐ ๋ฌธ์ ๊ฐ ์๋๋ฏ๋ก ์๋ตํ๋ค.)
ํ์ฌ ์์ ํ์ ๋ค์ด์จ ์ผ ์ค์ ์คํ์๊ฐ์ด ๊ฐ์ฅ ์งง์ ์ผ์ ์ ํํด์ผ ํ๋ฏ๋ก, ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ๋ฉด ์ฝ๊ฒ ํ ์ ์๋ค.
๐กSJF(Shortest Job First)๋?
์์ ์์์๊ฐ์ด ์งง์ ์ผ๋ถํฐ ์ฒ๋ฆฌํ๋ ์ค์ผ์ค๋ง ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, ํ๊ท ๋๊ธฐ ์๊ฐ์ ์ต์ํํ ์ ์๋ค.
0. ์ฃผ์ํด์ผ ํ ์
1. jobs ๋ฐฐ์ด์ ์ ๋ ฌ๋์ง ์์ ์ํ๋ก ์ฃผ์ด์ง ์ ์๋ค.
2. ํ๋๋์คํฌ๊ฐ ์์ ์ ์ํํ๊ณ ์์ง ์์ ์ํ์์, ๋์์ ์ฌ๋ฌ๊ฐ์ ์์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ํ์๊ฐ์ด ์งง์ ์์ ๋ถํฐ ์ฒ๋ฆฌํด์ผ ํ๋ค.
1. jobs ๋ฐฐ์ด ์ ๋ ฌํ๊ธฐ
๋ฌธ์ ์กฐ๊ฑด์ jobs ๋ฐฐ์ด์ด ์ ๋ ฌ๋ ์ํ๋ก ์ฃผ์ด์ง๋ค๋ ์กฐ๊ฑด์ด ์์ผ๋ฏ๋ก, ์ ๋ ฌ์ ๋จผ์ ํด์ฃผ์ด์ผ ํ๋ค.
1. ์์ฒญ ์๊ฐ์ด ๋น ๋ฅด๊ณ , 2. ์ํ ์๊ฐ์ด ์งง์ ์์๋๋ก ์ ๋ ฌํด์ฃผ๋ฉด ๋๋ค.
์ฌ๊ธฐ์ ์ํ ์๊ฐ์ด ์งง์ ์์๋๋ก ์ ๋ ฌํ๋ ๊ฑธ ๋นผ๋จน์ผ๋ฉด, 8๋ฒ&18๋ฒ ํ ์คํธ ์ผ์ด์ค์์ ํ๋ ธ์ต๋๋ค๋ฅผ ๋ฐ๊ฒ ๋๋ค๐ฅฒ
Arrays.sort(jobs, (o1, o2) -> {
if(o1[0]==o2[0]) return o1[1]-o2[1];
return o1[0]-o2[0];
});
2. ์์ ์ํํ๊ธฐ
- nowTime: ํ์ฌ ์๊ฐ์ ์๋ฏธํ๋ ๋ณ์
- idx: jobs ๋ฐฐ์ด์ ์ธ๋ฑ์ค
1. ์์ ํ์์ ์ํ์๊ฐ์ด ๊ฐ์ฅ ์งง์ ์์ ์ ๊บผ๋ด ์ํํ ๋ค, nowTime์ ์์ ์ ์ข ๋ฃ ์๊ฐ์ผ๋ก ๊ฐฑ์ ํ๋ค.
2. ์๊ฐ์ด ํ๋ฅธ ์ฌ์ด ์๋ก ์์ฒญ๋ ์์ ์ ์์ ํ์ ์ถ๊ฐํ๋ค. (nowTime >= jobs[idx][0]์ธ ๊ฒฝ์ฐ)
3. ๋์คํฌ๊ฐ ์ผ์ ํ ๋น๋ฐ์ง ์์ ์ฑ๋ก ๋๊ธฐํ๋ ๊ฒฝ์ฐ, ์ ์ ์์ ํ๊ฐ ๋น๊ฒ ๋๋ค.
(1) ๋ค์ ์์ jobs[idx]๋ฅผ ํ์ ์ถ๊ฐํ๋ค.
(2) nowTime์ ๋ค์ ์์ ์ ์์์๊ฐ์ผ๋ก ๊ฐฑ์ ํ๋ค.
4. ์์ ํ๊ฐ ๋น ๋๊น์ง 1~4๋ฅผ ๋ฐ๋ณตํ๋ค.
pq.add(new Work(jobs[0][0], jobs[0][1]));
int nowTime = jobs[0][0]; // ํ์ฌ ์๊ฐ
int idx = 1; // jobs ๋ฐฐ์ด์ ์ธ๋ฑ์ค
while(!pq.isEmpty()) {
Work work = pq.poll();
answer += (nowTime - work.startTime + work.workTime);
nowTime += work.workTime;
while(idx<jobs.length && jobs[idx][0]<=nowTime) {
pq.add(new Work(jobs[idx][0], jobs[idx][1]));
idx++;
}
if(pq.isEmpty() && idx<jobs.length) {
nowTime = jobs[idx][0];
pq.add(new Work(jobs[idx][0], jobs[idx][1]));
idx++;
}
}
์ ์ฒด ์ฝ๋
import java.util.*;
class Work implements Comparable<Work>{
int startTime;
int workTime;
public int compareTo(Work o) {
return this.workTime - o.workTime;
}
public Work(int startTime, int workTime) {
this.startTime = startTime;
this.workTime = workTime;
}
}
class Solution {
PriorityQueue<Work> pq = new PriorityQueue<>();
public int solution(int[][] jobs) {
int answer = 0;
Arrays.sort(jobs, (o1, o2) -> {
if(o1[0]==o2[0]) return o1[1]-o2[1];
return o1[0]-o2[0];
});
pq.add(new Work(jobs[0][0], jobs[0][1]));
int nowTime = jobs[0][0];
int idx = 1;
while(!pq.isEmpty()) {
Work work = pq.poll();
answer += (nowTime - work.startTime + work.workTime);
nowTime += work.workTime;
while(idx<jobs.length && jobs[idx][0]<=nowTime) {
pq.add(new Work(jobs[idx][0], jobs[idx][1]));
idx++;
}
if(pq.isEmpty() && idx<jobs.length) {
nowTime = jobs[idx][0];
pq.add(new Work(jobs[idx][0], jobs[idx][1]));
idx++;
}
}
return answer/jobs.length;
}
}
'๐๐ฅ๐ ๐จ๐ซ๐ข๐ญ๐ก๐ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค 10942] ํฐ๋ฆฐ๋๋กฌ? (0) | 2023.08.31 |
---|---|
[๋ฐฑ์ค 6086] ์ต๋ ์ ๋ (0) | 2023.08.28 |
[๋ฐฑ์ค 1062] ๊ฐ๋ฅด์นจ (0) | 2023.08.28 |
[๋ฐฑ์ค 2342] Dance Dance Revolution (0) | 2023.08.27 |
[๋ฐฑ์ค 16235] ๋๋ฌด ์ฌํ ํฌ (1) | 2023.08.27 |