DevYoon
[ํ๋ก๊ทธ๋๋จธ์ค] ๊ณผ์ ์งํํ๊ธฐ (Python) ๋ณธ๋ฌธ
link ๐ https://school.programmers.co.kr/learn/courses/30/lessons/176962
๋ฌธ์ ์ค๋ช
๊ณผ์ ๋ฅผ ๋ฐ์ ๋ฃจ๋ ๋ค์๊ณผ ๊ฐ์ ์์๋๋ก ๊ณผ์ ๋ฅผ ํ๋ ค๊ณ ๊ณํ์ ์ธ์ ์ต๋๋ค.
- ๊ณผ์ ๋ ์์ํ๊ธฐ๋ก ํ ์๊ฐ์ด ๋๋ฉด ์์ํฉ๋๋ค.
- ์๋ก์ด ๊ณผ์ ๋ฅผ ์์ํ ์๊ฐ์ด ๋์์ ๋, ๊ธฐ์กด์ ์งํ ์ค์ด๋ ๊ณผ์ ๊ฐ ์๋ค๋ฉด ์งํ ์ค์ด๋ ๊ณผ์ ๋ฅผ ๋ฉ์ถ๊ณ ์๋ก์ด ๊ณผ์ ๋ฅผ ์์ํฉ๋๋ค.
- ์งํ์ค์ด๋ ๊ณผ์ ๋ฅผ ๋๋์ ๋, ์ ์ ๋ฉ์ถ ๊ณผ์ ๊ฐ ์๋ค๋ฉด, ๋ฉ์ถฐ๋ ๊ณผ์ ๋ฅผ ์ด์ด์ ์งํํฉ๋๋ค.
- ๋ง์ฝ, ๊ณผ์ ๋ฅผ ๋๋ธ ์๊ฐ์ ์๋ก ์์ํด์ผ ๋๋ ๊ณผ์ ์ ์ ์ ๋ฉ์ถฐ๋ ๊ณผ์ ๊ฐ ๋ชจ๋ ์๋ค๋ฉด, ์๋ก ์์ํด์ผ ํ๋ ๊ณผ์ ๋ถํฐ ์งํํฉ๋๋ค.
- ๋ฉ์ถฐ๋ ๊ณผ์ ๊ฐ ์ฌ๋ฌ ๊ฐ์ผ ๊ฒฝ์ฐ, ๊ฐ์ฅ ์ต๊ทผ์ ๋ฉ์ถ ๊ณผ์ ๋ถํฐ ์์ํฉ๋๋ค.
๊ณผ์ ๊ณํ์ ๋ด์ ์ด์ฐจ์ ๋ฌธ์์ด ๋ฐฐ์ด 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]์ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
- ์งํ์ค์ด๋ ๊ณผ์ ๊ฐ ๋๋๋ ์๊ฐ๊ณผ ์๋ก์ด ๊ณผ์ ๋ฅผ ์์ํด์ผํ๋ ์๊ฐ์ด ๊ฐ์ ๊ฒฝ์ฐ ์งํ์ค์ด๋ ๊ณผ์ ๋ ๋๋ ๊ฒ์ผ๋ก ํ๋จํฉ๋๋ค.
ํ์ด ๊ณผ์
- plans๋ฅผ ์์ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํด์ค๋ค.
- ์๊ฐ ๊ณ์ฐ์ ํธํ๊ฒ ํ๊ธฐ ์ํด ์์ ์๊ฐ์ hh:mm์ ๋ถ ๋จ์๋ก ๊ณ์ฐํด ๊ต์ฒดํ๋ค.
- plans๋ฅผ ์ํํ๋ฉฐ ์ฐจ๋ก๋ก ์ข
๋ฃ ์๊ฐ๊ณผ ๋ค์ ์์ ์๊ฐ์ ๋น๊ตํ๋ค.
- ์ข ๋ฃ ์๊ฐ์ด ๋ค์ ์์ ์๊ฐ๋ณด๋ค ํด ๊ฒฝ์ฐ, ๊ธฐ๋ค๋ ค์ผ ํ๋ฏ๋ก wait์ ์ถ๊ฐํด์ค๋ค.
- ์ข
๋ฃ ์๊ฐ์ด ๋ค์ ์์ ์๊ฐ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฒฝ์ฐ, answer์ ์ถ๊ฐํด์ค๋ค.
- ์ฌ์ ์๊ฐ์ ๊ตฌํ๊ณ , wait์ ์ค๋จ๋ ๊ณผ์ ๊ฐ ์๊ณ ์ฌ์ ์๊ฐ์ด 1 ์ด์์ผ ๋ ๊ฐ์ฅ ์ต๊ทผ์ ์ค๋จ๋ ๊ณผ์ ๋ฅผ ์ฌ๊ฐํ๋ค.
- ์ํ๊ฐ ๋๋๊ณ wait์ ์ค๋จ๋ ๊ณผ์ ๊ฐ ๋จ์ ์๋ค๋ฉด, ๋์์๋ถํฐ ์ฐจ๋ก๋ก answer์ ์ถ๊ฐํด์ค๋ค.
1. ์ผ๋ถ๋ถ ์ค๋ต
def solution(plans):
answer = []
wait = []
plans.sort(key=lambda x: x[1])
for p in plans:
sub, start_time, play = p
# hh:mm => ๋ถ ๋จ์๋ก ๋ฐ๊ฟ์ฃผ๊ธฐ
hour, minute = map(int, start_time.split(":"))
cal_time = hour * 60 + minute
p[1] = cal_time
p[2] = int(p[2])
for idx in range(len(plans)):
# ์ข
๋ฃ ์๊ฐ ๊ตฌํ๊ธฐ
total = plans[idx][1] + plans[idx][2]
if idx + 1 < len(plans):
# ๋ค์ ์์ ์๊ฐ
next_value = plans[idx + 1][1]
# ์ข
๋ฃ ์๊ฐ > ๋ค์ ์์ ์๊ฐ => ๊ธฐ๋ค๋ ค์ผ ํจ
if total > next_value:
# wait์ ์ถ๊ฐ
wait.append([idx, plans[idx][0]])
# play_time ์ค์ฌ์ฃผ๊ธฐ
plans[idx][2] -= next_value - plans[idx][1]
else:
# ๋๋ฌ์ผ๋ฏ๋ก answer์ ์ถ๊ฐ
answer.append(plans[idx][0])
# ๋ค์ ์์ ์๊ฐ๊น์ง ๋จ์ ์ฌ์ ์๊ฐ
left = next_value - total
# ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ๊ณผ์ ๊ฐ ์๊ณ , ๋ค์ ์์ ์๊ฐ๊น์ง 1๋ถ ์ด์ ๋จ์๋ค๋ฉด
if wait and left > 0:
# ๊ฐ์ฅ ์ต๊ทผ ๋๊ธฐํ ๊ณผ์
item = wait[-1]
# ์ค์ผ ์ ์๋ ์๊ฐ ๊ณ์ฐ
reduce_playtime = plans[item[0]][2] - left
# ์ฌ์ ์๊ฐ ๋ด์ ๊ณผ์ ๋ฅผ ๋ชจ๋ ๋๋ด์ง ๋ชปํ๋ค๋ฉด ๋จ์ ์๊ฐ ๊ฐฑ์
if reduce_playtime > 0:
plans[item[0]][2] = reduce_playtime
else:
# ๋ค ๋๋์ผ๋ฉด answer์ ์ถ๊ฐ
wait.pop()
answer.append(item[1])
else:
answer.append(plans[idx][0])
# ๋จ์ ๋๊ธฐ ์ค์ธ ๊ณผ์ ๋ค => ๋ค์์๋ถํฐ answer์ ๋ฃ์ด์ฃผ๊ธฐ(๊ฐ์ฅ ์ต๊ทผ์ ๋ค์ด์ด => ๋จผ์ ๋๊ฐ)
for item in wait[::-1]:
answer.append(item[1])
return answer
- 4, 5, 6, 8, 9, 10๋ฒ ํ ์คํธ์์ ์คํจ๊ฐ ๋ด๋ค.
- ์์ธ์ ์ ์ ์์ด์ ๊ฝค ์ค๋ ๊ณ ๋ฏผํ๋๋ฐ, ์ฌ์ ์๊ฐ ๋ด์ ์ฒ๋ฆฌํ ์ ์๋ ์ค๋จ๋ ๊ณผ์ ๊ฐ 1๊ฐ ์ด์์ด๋ผ๋ ์ ์ ๊ณ ๋ คํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ด์๋ค.
- ๋ฐ๋ผ์ ์๋์ ๊ฐ์ด ์ฌ์ ์๊ฐ์ด ์๊ธด๋ค๋ฉด, while๋ฌธ์ ํตํด ์ต๋ํ ์ค๋จ๋ ๊ณผ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์์ ํ๋ค.
2. ๋ฐํ์ ์๋ฌ
def solution(plans):
answer = []
wait = []
plans.sort(key=lambda x: x[1])
for p in plans:
sub, start_time, play = p
# hh:mm => ๋ถ ๋จ์๋ก ๋ฐ๊ฟ์ฃผ๊ธฐ
hour, minute = map(int, start_time.split(":"))
cal_time = hour * 60 + minute
p[1] = cal_time
p[2] = int(p[2])
for idx in range(len(plans)):
# ์ข
๋ฃ ์๊ฐ ๊ตฌํ๊ธฐ
total = plans[idx][1] + plans[idx][2]
if idx == len(plans)-1:
answer.append(plans[idx][0])
else:
# ๋ค์ ์์ ์๊ฐ
next_value = plans[idx + 1][1]
# ์ข
๋ฃ ์๊ฐ > ๋ค์ ์์ ์๊ฐ => ๊ธฐ๋ค๋ ค์ผ ํจ
if total > next_value:
plans[idx][2] -= next_value - plans[idx][1]
# wait์ ์ถ๊ฐ
wait.append([plans[idx][0], plans[idx][2]])
# play_time ์ค์ฌ์ฃผ๊ธฐ
else:
# ๋๋ฌ์ผ๋ฏ๋ก answer์ ์ถ๊ฐ
answer.append(plans[idx][0])
# ๋ค์ ์์ ์๊ฐ๊น์ง ๋จ์ ์ฌ์ ์๊ฐ
left = next_value - total
# ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ๊ณผ์ ๊ฐ ์๊ณ , ๋ค์ ์์ ์๊ฐ๊น์ง 1๋ถ ์ด์ ๋จ์๋ค๋ฉด
if wait and left > 0:
for item in wait[::-1]:
title, playtime = item
if playtime <= left:
wa
while left > 0:
# ๊ฐ์ฅ ์ต๊ทผ ๋๊ธฐํ ๊ณผ์
title, playtime = wait[-1]
# ์ค์ผ ์ ์๋ ์๊ฐ ๊ณ์ฐ
# ๊ฐ์ฅ ์ต๊ทผ ์ค๋จํ ๊ณผ์ ๊ฐ ์ฌ์ ์๊ฐ ๋ด์ ๋๋ผ ์ ์๋ค๋ฉด => answer์ ์ถ๊ฐ
if playtime <= left:
wait = wait[:-1]
answer.append(title)
left -= playtime
# ๊ฐ์ฅ ์ต๊ทผ ์ค๋จํ ๊ณผ์ ๊ฐ ์ฌ์ ์๊ฐ ๋ด์ ๋ค ๋๋ผ ์ ์๋ค๋ฉด => ๋จ์ ์๊ฐ ๊ฐฑ์
else:
wait[-1][1] -= left
break
# ๋จ์ ๋๊ธฐ ์ค์ธ ๊ณผ์ ๋ค => ๋ค์์๋ถํฐ answer์ ๋ฃ์ด์ฃผ๊ธฐ(๊ฐ์ฅ ์ต๊ทผ์ ๋ค์ด์ด => ๋จผ์ ๋๊ฐ)
for item in wait[::-1]:
answer.append(item[0])
return answer
- ํ์ง๋ง ์ด๋ฒ์ ๋ฐํ์์๋ฌ๊ฐ ๋ฌ๋ค ๐ฅฒ
- while๋ฌธ์ for๋ฌธ์ผ๋ก ๋ฐ๊พธ์ด ์คํ ์๋๋ฅผ ์ค์ฌ์ฃผ์๋ค.
3. ์ต์ข ์ ๋ต
def solution(plans):
answer = []
wait = []
plans.sort(key=lambda x: x[1])
for p in plans:
sub, start_time, play = p
# hh:mm => ๋ถ ๋จ์๋ก ๋ฐ๊ฟ์ฃผ๊ธฐ
hour, minute = map(int, start_time.split(":"))
cal_time = hour * 60 + minute
p[1] = cal_time
p[2] = int(p[2])
for idx in range(len(plans)):
# ์ข
๋ฃ ์๊ฐ ๊ตฌํ๊ธฐ
total = plans[idx][1] + plans[idx][2]
if idx == len(plans)-1:
answer.append(plans[idx][0])
else:
# ๋ค์ ์์ ์๊ฐ
next_value = plans[idx + 1][1]
# ์ข
๋ฃ ์๊ฐ > ๋ค์ ์์ ์๊ฐ => ๊ธฐ๋ค๋ ค์ผ ํจ
if total > next_value:
plans[idx][2] -= next_value - plans[idx][1]
# wait์ ์ถ๊ฐ
wait.append([plans[idx][0], plans[idx][2]])
# play_time ์ค์ฌ์ฃผ๊ธฐ
else:
# ๋๋ฌ์ผ๋ฏ๋ก answer์ ์ถ๊ฐ
answer.append(plans[idx][0])
# ๋ค์ ์์ ์๊ฐ๊น์ง ๋จ์ ์ฌ์ ์๊ฐ
left = next_value - total
# ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ๊ณผ์ ๊ฐ ์๊ณ , ๋ค์ ์์ ์๊ฐ๊น์ง 1๋ถ ์ด์ ๋จ์๋ค๋ฉด
if wait and left > 0:
temp = wait[:]
# ์ฌ์ ์๊ฐ ๋ด์ ํด๊ฒฐํ ์ ์๋ ๊ณผ์ ๊ฐ 1๊ฐ ์ด์์ผ ์๋ ์์!!
for idx in range(len(temp)-1, -1, -1):
title, playtime = temp[idx]
if playtime < left:
wait.pop(idx)
answer.append(title)
left -= playtime
elif playtime == left:
wait.pop(idx)
answer.append(title)
break
else:
wait[idx][1] -= left
break
# ๋จ์ ๋๊ธฐ ์ค์ธ ๊ณผ์ ๋ค => ๋ค์์๋ถํฐ answer์ ๋ฃ์ด์ฃผ๊ธฐ(๊ฐ์ฅ ์ต๊ทผ์ ๋ค์ด์ด => ๋จผ์ ๋๊ฐ)
for item in wait[::-1]:
answer.append(item[0])
return answer
- ํต๊ณผ!