๋ฌธ์ ๋งํฌ
https://school.programmers.co.kr/learn/courses/30/lessons/176962
๋ฌธ์ ์์ฝ
๊ณผ์ ๋ฅผ ํ๊ธฐ ์ํ ๊ณํ์ ์ธ์ ๋ค. plans
๋ผ๋ ๋ฆฌ์คํธ๊ฐ ์ฃผ์ด์ง๊ณ ๋ฆฌ์คํธ์ ์์๋ก ๊ณผ์ ์ด๋ฆ(name)
, ์์ ์๊ฐ(start)
, ๊ณผ์ ๋ฅผ ํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ(playtime)
์ ๊ฐ์ง๋ ๋ฆฌ์คํธ๊ฐ ์ฃผ์ด์ง๋ค.
๊ทธ๋ฆฌ๊ณ ๊ณํ์ ์ฃผ์ด์ง ๊ณผ์ ๋ฅผ ์งํํ๋ฉด์ ์กฐ๊ฑด์ ๋ง๊ฒ ์ฐ์ ์์๋ฅผ ์ ํด์ ์งํํ๋ ค๊ณ ํ๋ค.
๋ฌธ์ ์์ ๊ณผ์ ๋ฅผ ํ๊ธฐ ์ํ ์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ๊ณ ์๋ค.
- ๊ณผ์ ๋ ์์ํ๊ธฐ๋ก ํ ์๊ฐ์ด ๋๋ฉด ์์ํ๋ค.
- ์๋ก์ด ๊ณผ์ ๋ฅผ ์์ํ ์๊ฐ์ด ๋์์ ๋, ๊ธฐ์กด์ ์งํ ์ค์ด๋ ๊ณผ์ ๊ฐ ์๋ค๋ฉด ์งํ ์ค์ด๋ ๊ณผ์ ๋ฅผ ๋ฉ์ถ๊ณ ์๋ก์ด ๊ณผ์ ๋ฅผ ์์ํ๋ค.
- ์งํ์ค์ด๋ ๊ณผ์ ๋ฅผ ๋๋์ ๋, ์ ์ ๋ฉ์ถ ๊ณผ์ ๊ฐ ์๋ค๋ฉด, ๋ฉ์ถฐ๋ ๊ณผ์ ๋ฅผ ์ด์ด์ ์งํํ๋ค.
- ๋ง์ฝ, ๊ณผ์ ๋ฅผ ๋๋ธ ์๊ฐ์ ์๋ก ์์ํด์ผ ๋๋ ๊ณผ์ ์ ์ ์ ๋ฉ์ถฐ๋ ๊ณผ์ ๊ฐ ๋ชจ๋ ์๋ค๋ฉด, ์๋ก ์์ํด์ผ ํ๋ ๊ณผ์ ๋ถํฐ ์งํํ๋ค.
- ๋ฉ์ถฐ๋ ๊ณผ์ ๊ฐ ์ฌ๋ฌ ๊ฐ์ผ ๊ฒฝ์ฐ, ๊ฐ์ฅ ์ต๊ทผ์ ๋ฉ์ถ ๊ณผ์ ๋ถํฐ ์์ํ๋ค.
๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด๋ณด๋ฉด ์๊ฐ์ด ๋๋ฉด ๊ณผ์ ๋ฅผ ์์ํ๊ณ ํ๊ณ ์๋ ๊ณผ์ ๊ฐ ๋๋์ง ์์๋๋ฐ ๋ค๋ฅธ ๊ณผ์ ๋ฅผ ํด์ผํ๋ฉด ํ๋ ๊ณผ์ ๋ฅผ ๋ฉ์ถ๊ณ ๋ค์ ๊ณผ์ ๋ฅผ ํ๋ค. ๋ง์ง๋ง ๊ณผ์ ๋ฅผ ๋ง์น๊ณ ๋์ ํ์ง ๋ชปํ ๊ณผ์ ์ค์์ ๊ฐ์ฅ ์ต๊ทผ์ ๋ฉ์ถ ๊ณผ์ ๋ถํฐ ์งํํ๋ค.
๋ฌธ์ ํ์ด
๋จผ์ ์๊ฐ ์์๋๋ก ๊ณผ์ ๋ฅผ ํด์ผํ๋๋ฐ plans
๋ผ๋ ๋ฆฌ์คํธ๊ฐ ์๊ฐ ์์ผ๋ก ์ ๋ ฌ๋์ด์์ง ์์ ์๊ฐ ์์๋๋ก ์ ๋ ฌ์ ๋จผ์ ํด์ฃผ์๋ค.
plans.sort(key=lambda x: x[1])
๋ค์ ์งํ์ค์ธ ๊ณผ์ ๋ฅผ ์ ์ฅํ ๋ฆฌ์คํธ์ ํ์ฌ ์๊ฐ ๋ณ์๋ฅผ ๋ง๋ค์ด์ค๋ค.
running = [] # ์งํ ์ค์ธ ์ผ์ ๋ค์ ์ ์ฅํ ์คํ
current_time = 0 # ํ์ฌ ์๊ฐ
๊ทธ๋ฆฌ๊ณ ๊ณํ์ ์๋ ๊ณผ์ ๋ค์ ๊ฐ์ ธ์์ ์๊ฐ์ ๋ถ์ผ๋ก ๋ฐ๊ฟ์ค ์ด์ ๋ ์ฝ๋ก (:)
์ผ๋ก ์์ ๋ถ์ด ๊ตฌ๋ถ๋์ด์์ด ์ฒ๋ฆฌ๊ฐ ์ด๋ ต๋ค๊ณ ํ๋จ์ด ๋์๊ธฐ ๋๋ฌธ์ ๋ถ
์ผ๋ก ๋ณํํด์ฃผ์๋ค.
for plan in plans:
name, start, playtime = plan
# ์๊ฐ์ ๋ถ์ผ๋ก ๋ณํ
start = int(start[:2]) * 60 + int(start[3:])
playtime = int(playtime)
๊ณผ์ ํ ์๊ฐ์ด ๋๋ฉด ๊ณผ์ ๋ฅผ ํ๋์ฉ ์งํํ๋ฉด ๋๋๋ฐ ์ฒ์์๋ ์งํ์ค์ธ ๊ณผ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์คํ์ ๊ณผ์ ๋ฅผ ๋ฃ์ด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ํ์ฌ ์๊ฐ์ ๊ณผ์ ๋ฅผ ์์ํ ์๊ฐ์ด ๋๋ค.
๋ค์ ๊ณผ์ ๊ฐ ๋ค์ด์์ ๋ ํ์ฌ ์งํ์ค์ธ ๊ณผ์ ๊ฐ ์์ง ๋๋์ง ์์๋ค๋ฉด ํ์ฌ ์งํํ๊ณ ์๋ ๊ณผ์ ์ ๋จ์ ์๊ฐ์์ ํ์ฌ ์ง๋๊ฐ ์๊ฐ์ ์ ์ธํด์ฃผ๊ณ ๊ณผ์ ๋ฅผ ๋ฉ์ถ๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ก์ด ๊ณผ์ ๋ฅผ ์คํ์ ๋ฃ์ด์ค๋ค. ์ด๋, ์คํ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ์ต๊ทผ์ ๋ค์ด๊ฐ ๊ณผ์ ๊ฐ ํ์ฌ ์งํ์ค์ธ ๊ณผ์ ๋ผ๊ณ ์๊ฐํด์ผ ํ๋ค.
# ์คํ์ ๋จ์ ์ผ์ ์ ๋จ์ ์๊ฐ์ ์
๋ฐ์ดํธ
if running:
running[-1][1] -= (start - current_time)
# ์๋ก์ด ์ผ์ ์คํ์ ์ถ๊ฐ
running.append([name, playtime])
current_time = start
๋ง์ฝ, ์งํ ์ค์ธ ๊ณผ์ ๊ฐ ๋ค์ ๊ณผ์ ๋ฅผ ์์ํ๊ธฐ ์ ์ ๋์ด ๋๋ค๋ฉด ๊ณผ์ ๋ฅผ ๋๋ด๊ณ ๊ณผ์ ์ด๋ฆ์ ๊ฒฐ๊ณผ์ ๋ฃ์ด์ค๋ค.
# ์คํ์ ์๋ ์ผ์ ์ฒ๋ฆฌ
while running and current_time + running[-1][1] <= start:
last_name, last_playtime = running.pop()
current_time += last_playtime
answer.append(last_name)
๊ณ์ํด์ ๊ณผ์ ๋ฅผ ๋๋ด๊ฑฐ๋ ์๋ก์ด ๊ณผ์ ๋ฅผ ์์ํ ๋ ํ์ฌ ์๊ฐ์ ์
๋ฐ์ดํธ ํด์ฃผ์ด์ผ ํ๊ณ ๊ณผ์ ๋ฅผ ๋ฉ์ถ์๋ค๋ฉด ์ง๋๊ฐ ์๊ฐ์ ๋นผ์ฃผ์ด์ผ ํ๋ค.
์์ ์ฝ๋๋ฅผ ์ชผ๊ฐ๊ฐ๋ฉด์ ์ค๋ฉํด๋ณด์๋๋ฐ ์ค๋ช
์ผ๋ก๋ง ๋ณธ๋ค๋ฉด ์ ๋ง ์ฝ๊ฒ ๋๊ปด์ง์ง๋ง ์ด๋ฌํ ๊ณผ์ ์ ์ง์ ์ฝ๋๋ก ์์ฑํ๋ ๋ฐ ์์ด ๋ง์ด ๊ณ ๋ฏผํ๊ณ ์์ฑํ๋ ๊ฒ ๊ฐ๋ค.
์กฐ๊ธ ๋ ์ดํดํ๊ธฐ ์์ ๋ฅผ ํตํด ์ฝ๊ฒ ๊ทธ๋ฆผ์ผ๋ก ์ค๋ช
ํ๋ฉด ์ข์ ๊ฒ ๊ฐ์์ ๊ทธ๋ ค๋ณด์๋ค.
๊ทธ๋ฆผ์์ ์ฌ์ฉํ ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
plans = [
["science", "12:40", "50"],
["music", "12:20", "40"],
["history", "14:00", "30"],
["computer", "12:30", "100"]
]
result = ["science", "history", "computer", "music"]
๋จผ์ ์๊ฐ ์์ผ๋ก ์ ๋ ฌํ๊ณ ๋์ ๋ถ์ผ๋ก ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค.
์ด์ ํ๋์ฉ ์๋ฎฌ๋ ์ด์ ์ ๋๋ ค๋ณด์.
์ฒซ ๊ณผ์ ์ธ music
์ ์์ํ ๋์๋ ํ์ฌ ์งํ์ค์ธ ๊ณผ์ ๊ฐ ์์๊ธฐ ๋๋ฌธ์ ์งํ์ค์ธ ๋ฆฌ์คํธ์ ๊ณผ์ ๋ฅผ ๋ฃ์ด์ฃผ๊ณ ํ์ฌ ์๊ฐ์ ๊ณผ์ ๊ฐ ์์ํ ๋ ์ง๋ก ๋ง๋ค์ด์ค๋ค.
๋ค์ ๊ณผ์ ์ธ computer
๋ฅผ ์์ํด์ผํ๋๋ฐ ์์ง music
๊ณผ์ ๊ฐ ๋๋์ง ์์๊ธฐ ๋๋ฌธ์ music
๊ณผ์ ๋ฅผ ๋ฉ์ถ๊ณ computer
๊ณผ์ ๋ฅผ ์์ํ๋ค.
๊ทธ๋ฆฌ๊ณ 10๋ถ๋์ music
๊ณผ์ ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ๋จ์ ์๊ฐ์์ 10๋ถ์ ๋นผ์ฃผ์ด์ผ ํ๋ค.
๋ค์๋ ๋ง์ฐฌ๊ฐ์ง๋ก computer
๊ณผ์ ๋ฅผ ๋๋ด๊ธฐ ์ ์ science
๊ณผ์ ๋ฅผ ๋จผ์ ์์ํด์ผํ๊ธฐ ๋๋ฌธ์ computer
๊ณผ์ ๋ฅผ ๋ฉ์ถ๊ณ science
๊ณผ์ ๋ฅผ ์์ํ๋ค.
์ด๋์๋ 10๋ถ๋์ computer
๊ณผ์ ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ๋จ์ ์๊ฐ์์ 10๋ถ์ ๋นผ์ฃผ์ด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ ๊ณผ์ ์ธ hisotry
๊ณผ์ ๋ฅผ ์์ํ๊ธฐ ์ ์ science
๊ณผ์ ๊ฐ ๋จผ์ ๋๋๊ฒ ๋๋ค.
์ด๋ ํ์ฌ ์๊ฐ์ science
๊ณผ์ ๊ฐ ๋๋๋ ์๊ฐ์ด ๋๊ณ ์ด์ ์ ๋ฉ์ถ computer
๊ณผ์ ๋ฅผ ๋ง์ ์งํํ๋ค.
๊ทธ๋ผ ๊ณผ์ ๊ฐ ๋๋ ๊ฒฐ๊ณผ์ ์ถ๊ฐ๋ฅผ ์์ผ์ฃผ๋ฉด ๋๋ค.
science
๊ณผ์ ๋ฅผ ๋๋ด๊ณ ๊ทธ ์ ์ ๋ฉ์ถ์๋ computer
๊ณผ์ ๋ฅผ ํ๋๋ฐ ๋๋ด๊ธฐ ์ ์ history
๊ณผ์ ๋ฅผ ๋จผ์ ์์ํด์ผํ๊ธฐ ๋๋ฌธ์ history
๊ณผ์ ๋ฅผ ์์ํ๋ค.
์ด๋์๋ 30๋ถ๋์ computer
๊ณผ์ ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ๋จ์ ์๊ฐ์์ 30๋ถ์ ๋นผ์ฃผ์ด์ผ ํ๋ค.
์ด์ ๋ ์ด์ ๋จ์์๋ ๊ณผ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ์ต๊ทผ์ ๋ฉ์ถ์๋ ๊ณผ์ ๋ถํฐ ํ๋์ฉ ๋๋ด์ฃผ๋ฉด ๋๋ค.
์ด๋ฌํ ๊ณผ์ ์ ๊ฑฐ์ณ ์กฐ๊ฑด์ ๋ง๊ฒ ๊ณผ์ ๋ฅผ ๋ง๋ฌด๋ฆฌํ ์ ์๋ค.
๊ฑฐ์ 3์ฃผ? ๋ง์ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ๋ค์ ๋ค์ฌ๋ค๋ณธ ๊ฒ ๊ฐ์๋ฐ ์ด๋ป๊ฒ ๋ณด๋ฉด ์กฐ๊ธ๋ง ๋ ์ง์คํด์ ์๊ฐํด๋ดค๋ค๋ฉด ๋น ๋ฅธ ์๊ฐ ์์ ์ถฉ๋ถํ ํ ์ ์์๋ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํ๋๋ฐ ์ค๋๋ง์ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ํ๋ค๋ณด๋ ๊ฐ์ ๋ง์ด ์์ ๊ฒ ๊ฐ๊ธฐ๋ ํ๋ค. ์ด๋ป๊ฒ ์์๋ฅผ ์ฒ๋ฆฌํด์ค ๊ฒ์ธ์ง์ ๋ํ ๋ฌธ์ ์ ์๊ฐ์ ์ด๋ป๊ฒ ์ ๋ฐ์ดํธ ์์ผ์ฃผ๊ณ ๋น๊ต๋ฅผ ํด์ค์ง ๊ทธ๋ฆฌ๊ณ ์คํ์ผ๋ก ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ฃผ๋ฉด ์ข์์ง์ ๋ํด์ ๋ง์ ๊ณ ๋ฏผ์ด ํ์ํ๋ ๋ฌธ์ ์๋ ๊ฒ ๊ฐ๋ค. ๊ทธ๋ฆฌ๊ณ ํ์คํ ๊ทธ๋ฆผ์ผ๋ก ๊ทธ๋ ค๊ฐ๋ฉด์ ํ๋ฉด ์ดํด๊ฐ ์ฝ๊ธดํ์ง๋ง ์ฝ๋ฉ ํ ์คํธ๋ฅผ ๋ณผ ๋์๋ ๊ทธ๋ฆผ์ ๋งค๋ฒ ๊ทธ๋ ค๊ฐ๋ฉฐ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์กฐ๊ธ ๋ ์๊ฐํ๋ ์ฐ์ต์ ํด๋ด์ผ๊ฒ ๋ค.
์์ง์ ๊ธด ๋ฌธ์ ๋ฅผ ์ดํดํ๊ณ ์ฝ๋๋ก ์์ฑํ๋ ๊ณผ์ ์์ ๋ง์ด ๋ถ์กฑํ๋ค๊ณ ๋๊ผ๊ณ ์๊ฐ์ด ๋ ๋๋ง๋ค ํ๋์ฉ ๊พธ์คํ ํ์ด๋ด์ผ๊ฒ ๋ค.
์ ์ถ ๋ต์
def solution(plans):
answer = []
# ์
๋ ฅ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ: ์์ ์๊ฐ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ
plans.sort(key=lambda x: x[1])
running = [] # ์งํ ์ค์ธ ์ผ์ ๋ค์ ์ ์ฅํ ์คํ
current_time = 0 # ํ์ฌ ์๊ฐ
for plan in plans:
name, start, playtime = plan
# ์๊ฐ์ ๋ถ์ผ๋ก ๋ณํ
start = int(start[:2]) * 60 + int(start[3:])
playtime = int(playtime)
# ์คํ์ ์๋ ์ผ์ ์ฒ๋ฆฌ
while running and current_time + running[-1][1] <= start:
last_name, last_playtime = running.pop()
current_time += last_playtime
answer.append(last_name)
# ์คํ์ ๋จ์ ์ผ์ ์ ๋จ์ ์๊ฐ์ ์
๋ฐ์ดํธ
if running:
running[-1][1] -= (start - current_time)
# ์๋ก์ด ์ผ์ ์คํ์ ์ถ๊ฐ
running.append([name, playtime])
current_time = start
# ์คํ์ ๋จ์ ์ผ์ ์ฒ๋ฆฌ
while running:
answer.append(running.pop()[0])
return answer