[Algorithm] ๊ณผ์ ์งํํ๊ธฐ
๐ ๋ฌธ์
๊ณผ์ ๋ฅผ ๋ฐ์ ๋ฃจ๋ ๋ค์๊ณผ ๊ฐ์ ์์๋๋ก ๊ณผ์ ๋ฅผ ํ๋ ค๊ณ ๊ณํ์ ์ธ์ ์ต๋๋ค.
- ๊ณผ์ ๋ ์์ํ๊ธฐ๋ก ํ ์๊ฐ์ด ๋๋ฉด ์์ํฉ๋๋ค.
- ์๋ก์ด ๊ณผ์ ๋ฅผ ์์ํ ์๊ฐ์ด ๋์์ ๋, ๊ธฐ์กด์ ์งํ ์ค์ด๋ ๊ณผ์ ๊ฐ ์๋ค๋ฉด ์งํ ์ค์ด๋ ๊ณผ์ ๋ฅผ ๋ฉ์ถ๊ณ ์๋ก์ด ๊ณผ์ ๋ฅผ ์์ํฉ๋๋ค.
- ์งํ์ค์ด๋ ๊ณผ์ ๋ฅผ ๋๋์ ๋, ์ ์ ๋ฉ์ถ ๊ณผ์ ๊ฐ ์๋ค๋ฉด, ๋ฉ์ถฐ๋ ๊ณผ์ ๋ฅผ ์ด์ด์ ์งํํฉ๋๋ค.
- ๋ง์ฝ, ๊ณผ์ ๋ฅผ ๋๋ธ ์๊ฐ์ ์๋ก ์์ํด์ผ ๋๋ ๊ณผ์ ์ ์ ์ ๋ฉ์ถฐ๋ ๊ณผ์ ๊ฐ ๋ชจ๋ ์๋ค๋ฉด, ์๋ก ์์ํด์ผ ํ๋ ๊ณผ์ ๋ถํฐ ์งํํฉ๋๋ค.
- ๋ฉ์ถฐ๋ ๊ณผ์ ๊ฐ ์ฌ๋ฌ ๊ฐ์ผ ๊ฒฝ์ฐ, ๊ฐ์ฅ ์ต๊ทผ์ ๋ฉ์ถ ๊ณผ์ ๋ถํฐ ์์ํฉ๋๋ค.
๊ณผ์ ๊ณํ์ ๋ด์ ์ด์ฐจ์ ๋ฌธ์์ด ๋ฐฐ์ด plans๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ๊ณผ์ ๋ฅผ ๋๋ธ ์์๋๋ก ์ด๋ฆ์ ๋ฐฐ์ด์ ๋ด์ return ํ๋ solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ์ฌํญ
- 3 ≤ plans์ ๊ธธ์ด ≤ 1,000
- plans์ ์์๋ [name, start, playtime]์ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
- name : ๊ณผ์ ์ ์ด๋ฆ์ ์๋ฏธํฉ๋๋ค.
- 2 ≤ name์ ๊ธธ์ด ≤ 10
- name์ ์ํ๋ฒณ ์๋ฌธ์๋ก๋ง ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
- name์ด ์ค๋ณต๋๋ ์์๋ ์์ต๋๋ค.
- start : ๊ณผ์ ์ ์์ ์๊ฐ์ ๋ํ๋
๋๋ค.
- "hh:mm"์ ํํ๋ก "00:00" ~ "23:59" ์ฌ์ด์ ์๊ฐ๊ฐ๋ง ๋ค์ด๊ฐ ์์ต๋๋ค.
- ๋ชจ๋ ๊ณผ์ ์ ์์ ์๊ฐ์ ๋ฌ๋ผ์ ๊ฒน์น ์ผ์ด ์์ต๋๋ค.
- ๊ณผ์ ๋ "00:00" ... "23:59" ์์ผ๋ก ์์ํ๋ฉด ๋ฉ๋๋ค. ์ฆ, ์์ ๋ถ์ ๊ฐ์ด ์์์๋ก ๋ ๋นจ๋ฆฌ ์์ํ ๊ณผ์ ์ ๋๋ค.
- playtime : ๊ณผ์ ๋ฅผ ๋ง์น๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์๋ฏธํ๋ฉฐ, ๋จ์๋ ๋ถ์
๋๋ค.
- 1 ≤ playtime ≤ 100
- playtime์ 0์ผ๋ก ์์ํ์ง ์์ต๋๋ค.
- ๋ฐฐ์ด์ ์๊ฐ์์ผ๋ก ์ ๋ ฌ๋์ด ์์ง ์์ ์ ์์ต๋๋ค.
- name : ๊ณผ์ ์ ์ด๋ฆ์ ์๋ฏธํฉ๋๋ค.
- plans์ ์์๋ [name, start, playtime]์ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
- ์งํ์ค์ด๋ ๊ณผ์ ๊ฐ ๋๋๋ ์๊ฐ๊ณผ ์๋ก์ด ๊ณผ์ ๋ฅผ ์์ํด์ผํ๋ ์๊ฐ์ด ๊ฐ์ ๊ฒฝ์ฐ ์งํ์ค์ด๋ ๊ณผ์ ๋ ๋๋ ๊ฒ์ผ๋ก ํ๋จํฉ๋๋ค.
์ ์ถ๋ ฅ ์
[["korean", "11:40", "30"], ["english", "12:10", "20"], ["math", "12:30", "40"]] | ["korean", "english", "math"] |
[["science", "12:40", "50"], ["music", "12:20", "40"], ["history", "14:00", "30"], ["computer", "12:30", "100"]] | ["science", "history", "computer", "music"] |
[["aaa", "12:00", "20"], ["bbb", "12:10", "30"], ["ccc", "12:40", "10"]] | ["bbb", "ccc", "aaa"] |
โ๏ธ ํ์ด
์คํ ์ ์ฌ์ฉํ์ฌ ํ๋ฉด ๋๋ค๊ณ ์๊ฐํ๋ค. ๊ทธ ์ ์ ์๊ฐ์์๋๋ก ์ ๋ ฌ์ด ํ์ํ๋ค. ๋ชจ๋ ์๊ฐ์ ๋ถ ๋จ์๋ก ๋ฐ๊พธ๊ณ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค.
์ด์ ์ ๊ณผ์ ๊ฐ ๋๋๋ ์๊ฐ๊ณผ ๋ค์ ๊ณผ์ ์ ์์์๊ฐ์ ๋น๊ตํ๋ฉฐ ๋ฐ๋ณต๋ฌธ์ ์งํํ๋ค. ์ด์ ์๊ฐ์ ๋๋๋ ์๊ฐ์ ๊ณผ์ ์ ์์์๊ฐ + ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด๋ค. ๋ง์ฝ ๋๋๋ ์๊ฐ์ด ๋ค์ ๊ณผ์ ์ ์์์๊ฐ๋ณด๋ค ๋ฆ๋ค๋ฉด ๊ณผ์ ๋ฅผ ๋ค ํ ์ ์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก ์คํ ์ ๋ฃ์ด์ค๋ค. ์ด๋ ์คํ ์๋ ๊ณผ์ ์ด๋ฆ, ๋จ์ ์๊ฐ์ด ํจ๊ป ๋ค์ด๊ฐ๋ค. ๋ฐ๋๋ก ์ด์ ๊ณผ์ ์ ๋๋๋ ์๊ฐ์ด ๋ค์ ๊ณผ์ ์ ์์ ์๊ฐ๋ณด๋ค ๋น ๋ฅด๋ค๋ฉด ๋ค์ ๊ณผ์ ๋ฅผ ์์ํ๊ธฐ ์ ์ ๊ณผ์ ๋ฅผ ๋๋ผ ์ ์๊ธฐ ๋๋ฌธ์ answer์ ๊ณผ์ ๋ช ์ ๋ฃ์ด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ๋จ๋ ์ฌ์ ์๊ฐ๋์ ์คํ ์ ์๋ ๊ณผ์ ๋ฅผ ์ํํ๋ค. ๋ง์ฝ ๋จ์ ์ฌ์ ์๊ฐ์ด ์คํ ์ ์ ์ผ ๋ง์ง๋ง์ ์๋ ์์์ ๋จ์ ์๊ฐ๋ณด๋ค ํฌ๋ค๋ฉด ์คํ ์์ ์ ๊ฑฐํด์ฃผ๊ณ answer์ ๊ณผ์ ๋ช ์ ๋ฃ์ด์ฃผ๋ ์์ ์ ์คํ ์ ๊ณผ์ ๊ฐ ์กด์ฌํ ๋, ์ฌ์ ์๊ฐ์ด ํด ๋ ๊ณ์ํด์ ๋ฐ๋ณตํ๋ค.(while๋ฌธ ์ฌ์ฉ) ๋ง์ฝ ์ฌ์ ์๊ฐ๋์ ์คํ ๋ด ๊ณผ์ ๋ฅผ ๋๋ผ ์ ์๋ค๋ฉด ์ฌ์ ์๊ฐ ๋งํผ ๋จ์ ์๊ฐ์์ ๋นผ์ค๋ค.
plans ๋ฐฐ์ด ๋ฐ๋ณต๋ฌธ์ด ์ข ๋ฃ๋๊ฒ ๋๋ฉด ๋ง์ง๋ง ์์๋ ๋ฌด์กฐ๊ฑด ๋๋ผ ์ ์๊ธฐ ๋๋ฌธ์ answer์ ๋ฃ์ด์ฃผ๊ณ ์คํ ์ ๋จ์ ๊ณผ์ ๋ค์ popํ๋ฉฐ ํ๋์ฉ answer์ ์ถ๊ฐํด์คฌ๋ค.
โจ๏ธ ์ฝ๋
function solution(plans) {
var answer = [];
const queue = [];
plans = plans
.map(plan => {
const [assignment, start, time] = plan;
const [h, m] = start.split(':').map(Number);
return [assignment, h * 60 + m, +time];
})
.sort((a, b) => a[1] - b[1]);
for (let i = 1; i < plans.length; i++) {
const prevEndTime = plans[i - 1][1] + plans[i - 1][2];
if (prevEndTime > plans[i][1]) queue.push([plans[i - 1][0], prevEndTime - plans[i][1]]);
else {
answer.push(plans[i - 1][0]);
let remainingTime = plans[i][1] - prevEndTime;
while (queue.length && queue[queue.length - 1][1] <= remainingTime) {
const [assignment, needTime] = queue.pop();
remainingTime -= needTime;
answer.push(assignment);
}
if (remainingTime && queue.length) {
queue[queue.length - 1][1] -= remainingTime;
}
}
}
answer.push(plans[plans.length - 1][0]);
while (queue.length) {
const [assignment, needTime] = queue.pop();
answer.push(assignment);
}
return answer;
}