๋ฐ์ํ
๐ฑ ๋ฌธ์
https://school.programmers.co.kr/learn/courses/30/lessons/176962?language=python3#
๐ฑ ํ์ด
1. ๋ฌธ์์ด๋ก ๋ฐ๋ ์๊ฐ ์ ๋ณด๋ฅผ ์ฒ๋ฆฌ ํ, ์ ๋ ฌ
for plan in plans:
hh, mm = plan[1].split(":")
plan[1] = int(hh) * 60 + int(mm)
plan[2] = int(plan[2])
plans.sort(key=lambda x: x[1])
plans์ ์์ ์๊ฐ๊ณผ ์์ ์๊ฐ์ด ๋ชจ๋ ๋ฌธ์์ด๋ก ์ฃผ์ด์ง๋ฏ๋ก ์ด๋ฅผ ์ฒ๋ฆฌํด์ฃผ๋ ๊ฒ์ด ํ์ํฉ๋๋ค.
- ์์ ์๊ฐ์ "hh:mm" ํํ์ด๋ฏ๋ก hh * 60 + mm์ผ๋ก ๋ฐ๊พธ์ด์ค๋๋ค.
- ์์ ์๊ฐ์ ์ ์ํ์ผ๋ก ํ์ ์ ๋ฐ๊พธ์ด์ค๋๋ค.
plans๋ ์๊ฐ์์ผ๋ก ์ ๋ ฌ๋์ด ์์ง ์์ ์ ์์ผ๋ฏ๋ก ์ ๋ ฌํด์ฃผ์ด์ผ ํ๋๋ฐ, ์์ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๊ธฐ ์ํด sort() ๋ฉ์๋์ key๋ฅผ ์ง์ ํด์ฃผ์์ต๋๋ค.
*ํน์ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ์ค์ผ๋ก 2์ฐจ์ ๋ฐฐ์ด ์ ๋ ฌํ๊ธฐ: array.sort(key = lambda x: x[idx])
2. ์คํ์ ์ด์ฉํ ๊ตฌํ
completed_plan = []
not_started_plan = plans
stopped_plan = []
์๋ฃ๋ ๊ณผ๋ชฉ, ์์ํ์ง ์์ ๊ณผ๋ชฉ, ์ค๋จ๋ ๊ณผ๋ชฉ ๋ชจ๋ ์คํ์ ์ด์ฉํด์ ์ ์ฅํฉ๋๋ค.
3.
while not_started_plan:
name, start, playtime = not_started_plan.pop(0)
# ๋ง์ง๋ง ๊ณผ์ ๊ฐ ์๋๋ฉด
if not_started_plan:
next_name, next_start, next_playtime = not_started_plan[0]
# ์ค๋จ
if start + playtime > next_start:
stopped_plan.append(
[name, start, playtime - (next_start - start)])
else:
complete_plans.append(name)
remain = (next_start - start) - playtime
# ๊ณผ์ ๋ค ํ๊ณ ๋ ์๊ฐ ๋จ์
while remain > 0 and stopped_plan:
stop_name, stop_start, stop_playtime = stopped_plan.pop(-1)
if stop_playtime > remain:
stopped_plan.append(
[stop_name, stop_start, stop_playtime - remain])
else:
complete_plans.append(stop_name)
remain -= stop_playtime
else:
complete_plans.append(name)
while
loop์ผ๋ก ์์ํ์ง ์์ ๊ณผ์ (not_started_plan
)๊ฐ ์์ ๋๊น์ง ๋ฐ๋ณตํฉ๋๋ค.- ํด๋น ๊ณผ์ ๊ฐ
not_started_plan
์ ๋ง์ง๋ง ์์๊ฐ ์๋๋ผ๋ฉด ๋ค์ ์์(๊ณผ์ )์ ์์ ์๊ฐ๊ณผ ๋น๊ตํ์ฌ ํ์ฌ ๊ณผ์ ๋ฅผ ๋๋ผ ์ ์๋์ง, ์๋๋ฉด ์ค๋จํด์ผ ํ๋์ง๋ฅผ ๊ณ์ฐํฉ๋๋ค. - ์ค๋จํด์ผ ํ๋ค๋ฉด
stopped_plan
์ ํ์ฌ ๊ณผ์ ๋ฅผ ๋ฃ์ด์ค๋๋ค. ์ด๋ ์์์๊ฐ์ ์งํด๋ ์๊ฐ๋งํผ์ ๋นผ์ฃผ์ด์ ๋จ์ ์์ ์๊ฐ์ผ๋ก ๋ฃ์ด์ค๋๋ค. - ๊ณผ์ ๋ฅผ ๋๋ผ ์ ์๋ค๋ฉด
completed_plans
์ ๊ณผ๋ชฉ ์ด๋ฆ์ ๋ฃ์ด์ค๋๋ค.- ๊ณผ์ ๋ฅผ ๋๋ด๊ณ ๋จ์ ์๊ฐ(
remain
)์ ๊ณ์ฐํ์ฌ ๋จ์ ์๊ฐ๋์ ์ค๋จ๋ ๊ณผ์ ๋ฅผ ์ํํ ์ ์๋์ง ๊ฒ์ฌํฉ๋๋ค. remain
์ด 0 ์ด์์ผ ๋๊น์ง ๋ฐ๋ณตํ์ฌ ์ค๋จ๋ ๊ณผ์ ๋ฅผ ์ํํฉ๋๋ค. ์ด๋ outer loop๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ์งํ๋ฉ๋๋ค.
- ๊ณผ์ ๋ฅผ ๋๋ด๊ณ ๋จ์ ์๊ฐ(
- ์์ํ์ง ์์ ๊ณผ์ ๊ฐ ๋น ๋ฐฐ์ด์ด ๋๋ฉด ์ด์ ์ค๋จ๋ ๊ณผ์ ๋ฅผ ๋ค์์๋ถํฐ ์ฐจ๋ก๋ก ์ํํ๊ธฐ ๋๋ฌธ์ ์ด๋ฆ์ ์ฐจ๋ก๋ก
completed_plan
์ ๋ฃ์ด์ค๋๋ค.
๐ฑ ์ ๋ต ์ฝ๋
# !/usr/bin/env python
# -*- coding: utf-8 -*-
# programmers ๊ณผ์ ์งํํ๊ธฐ
def solution(plans):
complete_plans = []
for plan in plans:
hh, mm = plan[1].split(":")
plan[1] = int(hh) * 60 + int(mm)
plan[2] = int(plan[2])
plans.sort(key=lambda x: x[1])
current_time = plans[0][1]
not_started_plan = plans
stopped_plan = []
while not_started_plan:
name, start, playtime = not_started_plan.pop(0)
# ๋ง์ง๋ง ๊ณผ์ ๊ฐ ์๋๋ฉด
if not_started_plan:
next_name, next_start, next_playtime = not_started_plan[0]
# ์ค๋จ
if start + playtime > next_start:
stopped_plan.append(
[name, start, playtime - (next_start - start)])
else:
complete_plans.append(name)
remain = (next_start - start) - playtime
# ๊ณผ์ ๋ค ํ๊ณ ๋ ์๊ฐ ๋จ์
while remain > 0 and stopped_plan:
stop_name, stop_start, stop_playtime = stopped_plan.pop(-1)
if stop_playtime > remain:
stopped_plan.append(
[stop_name, stop_start, stop_playtime - remain])
else:
complete_plans.append(stop_name)
remain -= stop_playtime
else:
complete_plans.append(name)
while stopped_plan:
complete_plans.append(stopped_plan.pop(-1)[0])
return complete_plans
๋ฐ์ํ
๋๊ธ