https://school.programmers.co.kr/learn/courses/30/lessons/17678
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
โ๏ธ ๋ฌธ์ ์์ฝ
๋ค๋ฅธ ํฌ๋ฃจ๊ฐ ๋ฒ์ค ์ ๋ฅ์ฅ์ ๋์ฐฉํ๋ ์๊ฐ์ ์๊ณ ์์ ๋,
๊ฒ์ผ๋ฅธ ์ฝ์ด ๋ฒ์ค์ ํ ์ ์์ผ๋ฉด์ ๋ฒ์ค ์ ๋ฅ์ฅ์ ๊ฐ์ฅ ๋ฆ๊ฒ ๋์ฐฉํ๋ ค๋ฉด ๋ช ์(HH:MM)์ ๋์ฐฉํด์ผ ํ๋์ง ๋ฐํํ๋ผ.
- ๋ฒ์ค๋ 09:00 ๋ถํฐ ์ด n ํ t ๋ถ ๊ฐ๊ฒฉ์ผ๋ก ์ ๋ฅ์ฅ์ ๋์ฐฉํ๋ฉฐ, ํ ๋ฒ์ค์๋ ์ต๋ m ๋ช ์ ํฌ๋ฃจ๊ฐ ํ ์ ์๋ค.
- ๋ฒ์ค์ ์๋ฆฌ๋ง ์๋ค๋ฉด, ๋ฒ์ค์ ๋์์ ๋์ฐฉํ ํฌ๋ฃจ๊น์ง ํ ์ ์๋ค.
- ์ฝ์ ๊ฐ์ ์๊ฐ์ ๋์ฐฉํ ํฌ๋ฃจ ์ค ๋๊ธฐ์ด์์ ์ ์ผ ๋ค์ ์ ๋ค.
๐ช ๋์ ํ์ด
์ ์ฒด ์ฝ๋
# n: ์
ํ์ (๋)
# t: ์ดํ ๊ฐ๊ฒฉ (๋ถ)
# m: ์ต๋ ์ธ์ (๋ช
)
def hourToMin(str):
hh, mm = map(int, str.split(':'))
return hh * 60 + mm
def minToHour(min):
return '{0:02d}'.format(min//60) + ':' + '{0:02d}'.format(min%60)
def solution(n, t, m, timetable):
crew_arrival = sorted([hourToMin(x) for x in timetable]) # ํฌ๋ฃจ ๋์ฐฉ ์๊ฐ(๋ถ)
bus_arrival = [540 + i*t for i in range(n)] # ๋ฒ์ค ๋์ฐฉ ์๊ฐ(๋ถ)
idx = 0 # ์ด์ ๋ฒ์ค์ ํ ์ฐจ๋ก์ธ ํฌ๋ฃจ ์ธ๋ฑ์ค (์์ง ์ ํ)
cnt = 0 # ๊ฐ ๋ฒ์ค์ ํ์นํ ์ธ์์
for x in bus_arrival:
cnt = 0
while idx < len(crew_arrival) and crew_arrival[idx] <= x and cnt < m: # ํฌ๋ฃจ ํ์น ์กฐ๊ฑด
idx += 1
cnt += 1
if cnt < m: # ๋ง์ง๋ง ๋ฒ์ค์ ์๋ฆฌ ๋จ์์ผ๋ฉด
return minToHour(bus_arrival[-1]) # ๋ง์ง๋ง ๋ฒ์ค ๋์ฐฉ ์๊ฐ์ ๋ง์ถฐ ๋์ฐฉํ๋ฉด ๋๋ค
else: # ๋ง์ง๋ง ๋ฒ์ค์ ์๋ฆฌ ์๋จ์์ผ๋ฉด
return minToHour(crew_arrival[idx-1]-1) # ๋ง์ง๋ง์ผ๋ก ํ์นํ ํฌ๋ฃจ๋ณด๋ค 1๋ถ ์ผ์ฐ ๋์ฐฉํด์ผ ํ๋ค
์ธ๋ถ ์ค๋ช
ํธ์๋ฅผ ์ํด HH:MM์ ๋ฌธ์์ด์ ๋ถ์ผ๋ก ๋ณ๊ฒฝํ๊ณ , ๋ฐ๋๋ก ๋ถ์ HH:MM ํํ๋ก ๋ณ๊ฒฝํ๋ hourToMin๊ณผ minToHour ํจ์๋ฅผ ์ ์ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฌธ์ ์ ๋์ค๋ ๋ชจ๋ HH:MM ํํ์ ๋ฌธ์์ด์ "๋ถ"์ผ๋ก ๋ณ๊ฒฝํด์ ์๊ฐํ์.
๋ฌธ์ ์์ ์ฃผ์ด์ง timetable์ ์ด์ฉํด ํฌ๋ฃจ์ ๋์ฐฉ ์๊ฐ์ ๊ณ์ฐํ๊ณ ์ด๋ฅผ ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋ค.
๊ทธ๋ฆฌ๊ณ n๊ณผ t๋ฅผ ์ด์ฉํด ๋ฒ์ค์ ๋์ฐฉ ์๊ฐ์ ๋ฏธ๋ฆฌ ๊ณ์ฐํด๋๋ค.
์ด ํ์ด์์ ํต์ฌ ๋ก์ง์, ๊ฐ ๋ฒ์ค๋ฅผ ์ํํ๋ฉฐ idx์ cnt ๋ณ์๋ฅผ ๊ฐฑ์ ํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค.
- idx: ๋ฒ์ค์ ํ ์ฐจ๋ก์ธ ํฌ๋ฃจ ์ธ๋ฑ์ค (์์ง์ ์ ํ ํฌ๋ฃจ)
- cnt: ๊ฐ ๋ฒ์ค์ ํ์นํ ์ธ์ ์
idx = 0 # ์ด์ ๋ฒ์ค์ ํ ์ฐจ๋ก์ธ ํฌ๋ฃจ ์ธ๋ฑ์ค (์์ง ์ ํ)
cnt = 0 # ๊ฐ ๋ฒ์ค์ ํ์นํ ์ธ์์
for x in bus_arrival:
cnt = 0
while idx < len(crew_arrival) and crew_arrival[idx] <= x and cnt < m: # ํฌ๋ฃจ ํ์น ์กฐ๊ฑด
idx += 1
cnt += 1
์ํฉ์ ์ผ๋ก ์ค๋ช ํ์๋ฉด, ๊ฐ ๋ฒ์ค๊ฐ ๋์ฐฉํ์ ๋๋ง๋ค ํฌ๋ฃจ ํ์น ์กฐ๊ฑด์ ํ์ธํ๊ณ ํฌ๋ฃจ๋ฅผ ํ์ฐ๋ ๊ฒ์ด๋ค.
์ด๋ ๋ช ๋ฒ์งธ ํฌ๋ฃจ๊น์ง ํ์นํ๋์ง, ํ์ฌ ๋ฒ์ค์๋ ๋ช ๋ช ์ ํฌ๋ฃจ๊ฐ ํ์นํ๋์ง๋ฅผ ๊ฐฑ์ ํ๋ค.
ํฌ๋ฃจ ํ์น ์กฐ๊ฑด์ ์ ์ฝ๋์ while ๋ฌธ์ ์ ํ ์์๋๋ก ์๋์ ๊ฐ๋ค.
1. ํ์นํ ํฌ๋ฃจ๊ฐ ์๋์ง ํ์ธ
2. ํฌ๋ฃจ๊ฐ ๋ฒ์ค๋ณด๋ค ๋จผ์ ๋์ฐฉํ๋์ง (ํน์ ๋์์ ๋์ฐฉํ ๊ฒ๊น์ง ok) ํ์ธ
3. ๋ฒ์ค์ ํฌ๋ฃจ๊ฐ ํ์นํ ๊ณต๊ฐ์ด ๋จ์์๋์ง ํ์ธ
์ด๋ ๊ฒ ๋ฒ์ค๋ง๋ค `idx`์ `cnt`๋ฅผ ๊ฐฑ์ ํ๋ฉด, for๋ฌธ์ ํต๊ณผํ์ ๋ `idx`์ `cnt`์๋ ๋ง์ง๋ง ๋ฒ์ค์ ๋ํ ์ ๋ณด๊ฐ ๋จ๊ฒ ๋๋ค.
`idx`๋ ๋ง์ง๋ง์ ํ ํฌ๋ฃจ์ "๋ค์" ํฌ๋ฃจ ์ ๋ณด๋ก ๊ฐฑ์ ๋๋ค. ์ฆ, ๋ง์ง๋ง์ ํ ํฌ๋ฃจ๋ `idx-1` ๋ฒ์งธ ํฌ๋ฃจ์ด๋ค.
`cnt`์๋ ๋ง์ง๋ง ๋ฒ์ค์ ๋ช ๋ช ์ ํฌ๋ฃจ๊ฐ ํ๋์ง ์ ๋ณด๊ฐ ๋จ๋๋ค.
๊ทธ๋ผ ์ด์ ๋จธ๋ฆฌ๋ฅผ ๊ตด๋ ค์ ์ฝ์ด ๋ฌด์ฌํ ์ ํ์ ํ๊ณ ๊ฐ ์ ์๋ ์ ์ผ ๋ฆ์ ๋์ฐฉ ์๊ฐ์ ๋ํด ๊ณ ๋ฏผํ๋ฉด ๋๋ค!
๊ฒฐ๋ก ์ ์ผ๋ก (๋ฒ์ค๋ฅผ ํ ์ ์๋ ์๊ฐ ์ค) ๋ฒ์ค ์ ๋ฅ์ฅ์ ์ ์ผ "๋ฆ๊ฒ" ๋์ฐฉํ๋ ค๋ฉด, "๋ง์ง๋ง" ๋ฒ์ค๋ฅผ ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํด์ผํ๋ค.
๋ง์ง๋ง ๋ฒ์ค๋ฅผ ํ๊ธฐ ์ํด์๋ ๋ ๊ฐ์ง ์ผ์ด์ค๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ค.
1) ๋ง์ง๋ง ๋ฒ์ค์ ์๋ฆฌ๊ฐ ๋จ์๋ค๋ฉด -> ๋ง์ง๋ง ๋ฒ์ค ๋์ฐฉ ์๊ฐ๊ณผ ๋์ผํ๊ฒ ๋์ฐฉํ๋ ๊ฒ์ด ์ ๋ฅ์ฅ์ ์ต๋ํ ๋ฆ๊ฒ ๋์ฐฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
2) ๋ง์ง๋ง ๋ฒ์ค์ ์๋ฆฌ๊ฐ ๋จ์์์ง ์๋ค๋ฉด -> ๋ง์ง๋ง์ผ๋ก ํ์นํ ํฌ๋ฃจ๋ณด๋ค 1๋ถ ๋จผ์ ๋์ฐฉํด์ผ ๋ง์ง๋ง ๋ฒ์ค๋ฅผ ํ ์ ์๋ค.
if cnt < m: # ๋ง์ง๋ง ๋ฒ์ค์ ์๋ฆฌ ๋จ์์ผ๋ฉด
return minToHour(bus_arrival[-1]) # ๋ง์ง๋ง ๋ฒ์ค ๋์ฐฉ ์๊ฐ์ ๋ง์ถฐ ๋์ฐฉํ๋ฉด ๋๋ค
else: # ๋ง์ง๋ง ๋ฒ์ค์ ์๋ฆฌ ์๋จ์์ผ๋ฉด
return minToHour(crew_arrival[idx-1]-1) # ๋ง์ง๋ง์ผ๋ก ํ์นํ ํฌ๋ฃจ๋ณด๋ค 1๋ถ ์ผ์ฐ ๋์ฐฉํด์ผ ํ๋ค
๐ค ๋ค๋ฅธ ์ฌ๋์ ์ฝ๋๋ฅผ ํ๊ตฌํด๋ณด๊ธฐ
์ ์ฒด ์ฝ๋
# n: ์
ํ์ (๋)
# t: ์ดํ ๊ฐ๊ฒฉ (๋ถ)
# m: ์ต๋ ์ธ์ (๋ช
)
def minToHour(min):
return '{0:02d}'.format(min//60) + ':' + '{0:02d}'.format(min%60)
def solution(n, t, m, timetable):
answer = ''
crew_arrival = [int(x[:2])*60 + int(x[3:]) for x in timetable] # ํฌ๋ฃจ ๋์ฐฉ ์๊ฐ(๋ถ)
crew_arrival.sort()
last_time = 540 + (n - 1) * t
if len(crew_arrival) < m: # ํฌ๋ฃจ ์๊ฐ ๋ฒ์ค ์ ์๋ณด๋ค ์ ๋ค๋ฉด ์ถฉ๋ถํ ๋ง์ ๋ฒ์ค๊ฐ ์กด์ฌํ๋ ๊ฒ
return minToHour(last_time)
for i in range(n):
# ๋ง์ง๋ง ๋ฒ์ค๋ผ๋ฉด
if i == n - 1:
if crew_arrival[0] > last_time: # ํ ์์์ ํฌ๋ฃจ๊ฐ ๋ง์ง๋ง ๋ฒ์ค๋ณด๋ค ๋ฆ๊ฒ ๋์ฐฉํ๋๊น ์ด์ฐจํผ ๋ชป ํ
return minToHour(last_time) # ๋ง์ง๋ง ๋ฒ์ค ๋์ฐฉ ์๊ฐ๊น์ง ๋์ฐฉํ๋ฉด ๋๋ค
return minToHour(crew_arrival[m-1]-1) # ๋ง์ง๋ง์ผ๋ก ๋ฒ์ค์ ํ์นํ๋ ํฌ๋ฃจ๋ณด๋ค 1๋ถ ๋จผ์
# ๋ง์ง๋ง ๋ฒ์ค๊ฐ ์๋๋ผ๋ฉด
for j in range(m-1, -1, -1): # j๋ m-1๋ถํฐ 0๊น์ง
bus_arrival = 540 + i * t # ๋ฒ์ค ๋์ฐฉ ์๊ฐ
if crew_arrival[j] <= bus_arrival: # ํฌ๋ฃจ๊ฐ ๋ฒ์ค๋ณด๋ค ์ผ์ฐ ๋์ฐฉํ๋ค๋ฉด
del crew_arrival[j] # ๋ฆฌ์คํธ์์ ํฌ๋ฃจ ์ ๊ฑฐ (๋๊ธฐ ๋ฆฌ์คํธ์์ ํฌ๋ฃจ ์ ๊ฑฐ)
์ธ๋ถ ์ค๋ช
๋์ ํ์ด์ ๋ค๋ฅธ ๋ถ๋ถ๋ถํฐ ์ดํด๋ณด์.
์ฐ์ ํฌ๋ฃจ์ ์(`len(crew_arrival`)๊ฐ ๋ฒ์ค์ ์ ์(`m`)๋ณด๋ค ์์์ง ํ์ธํ๋ค.
๋ง์ฝ ์๋ค๋ฉด ์ด๋ฏธ ์ถฉ๋ถํ ๋ง์ ๋ฒ์ค๊ฐ ์กด์ฌํ๋ ์ํฉ์ด๊ธฐ ๋๋ฌธ์ ์ฝ์ ๋ง์ง๋ง ๋ฒ์ค ์๊ฐ(`last_time`)๊น์ง๋ง ๋์ฐฉํ๋ฉด ๋๋ค.
last_time = 540 + (n - 1) * t # ๋ง์ง๋ง ๋ฒ์ค์ ๋์ฐฉ ์๊ฐ
if len(crew_arrival) < m: # ํฌ๋ฃจ ์๊ฐ ๋ฒ์ค ์ ์๋ณด๋ค ์ ๋ค๋ฉด ์ถฉ๋ถํ ๋ง์ ๋ฒ์ค๊ฐ ์กด์ฌํ๋ ๊ฒ
return minToHour(last_time) # ๋ง์ง๋ง ๋ฒ์ค ์๊ฐ๊น์ง ๋์ฐฉํ๋ฉด ๋๋ค
๊ทธ๋ฆฌ๊ณ ์ด์ ๊ฐ ๋ฒ์ค๋ฅผ ์ํํ๋๋ฐ, ๋ง์ง๋ง ๋ฒ์ค์ ๋ง์ง๋ง ๋ฒ์ค๊ฐ ์๋ ๋์ ๋ก์ง์ด ๋ค๋ฅด๋ค.
์ดํด๋ฅผ ์ฝ๊ฒ ํ๊ธฐ ์ํด ๋ฒ์ค์ ์ ์(`m`)์ด 5๋ผ๊ณ ๊ฐ์ ํ์.
๋ง์ง๋ง ๋ฒ์ค๊ฐ ์๋ ๋
- `crew_arrival` 4๋ฒ ํฌ๋ฃจ๋ถํฐ 0๋ฒ ํฌ๋ฃจ๊น์ง ์ญ์์ผ๋ก ์ํํ๋ค.
- `crew_arrival` ๋ฆฌ์คํธ๋ ์ด๋ฏธ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋์ด ์๋ ์ํ์์ ์์ง ๋ง์.
- ํด๋น ๋ฒ์ค๋ณด๋ค ์ผ์ฐ (ํน์ ๋์์) ๋์ฐฉํ ํฌ๋ฃจ๋ง `crew_arrival` ๋ฆฌ์คํธ์์ ์ ๊ฑฐ(`del`)ํ๋ค. (ํ์นํ๋ค๋ ์๋ฏธ)
for j in range(m-1, -1, -1): # j๋ m-1๋ถํฐ 0๊น์ง
bus_arrival = 540 + i * t # ํด๋น ๋ฒ์ค ๋์ฐฉ ์๊ฐ
if crew_arrival[j] <= bus_arrival: # ํฌ๋ฃจ๊ฐ ๋ฒ์ค๋ณด๋ค ์ผ์ฐ ๋์ฐฉํ๋ค๋ฉด
del crew_arrival[j] # ํด๋น ํฌ๋ฃจ ํ์น (๋๊ธฐ ๋ฆฌ์คํธ์์ ํฌ๋ฃจ ์ ๊ฑฐ)
๋ง์ง๋ง ๋ฒ์ค์ผ ๋
- ์ด์ ๋ฒ์ค์ ํ์นํ ํฌ๋ฃจ๋ค์ ์ด๋ฏธ ์ ๊ฑฐ๋ ์ํ์ด๊ธฐ ๋๋ฌธ์ `crew_arrival[0]`์ ๋ค์ ๋ฒ์ค์ ๊ฐ์ฅ ๋จผ์ ํ ํฌ๋ฃจ๋ฅผ ์๋ฏธํ๋ค.
- ์ด๋ `crew_arrival[0]`์ด ๋ง์ง๋ง ๋ฒ์ค์ ํ์นํ ์ ์๋์ง, ์๋์ง์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
- `crew_arrival[0]`๊ฐ ๋ง์ง๋ง ๋ฒ์ค์ ํ์นํ ์ ์๋ค๋ฉด, ์ฝ์ ์ฌ์ ๋กญ๊ฒ ๋ง์ง๋ง ๋ฒ์ค ์๊ฐ๊น์ง๋ง ๋์ฐฉํ๋ฉด ๋๋ค.
- `crew_arrival[0]`๊ฐ ๋ง์ง๋ง ๋ฒ์ค์ ํ์นํ ์ ์๋ค๋ฉด, ํด๋น ํฌ๋ฃจ๋ณด๋ค 1๋ถ ๋จผ์ ๋์ฐฉํด์ผ ๋ฒ์ค์ ํ์นํ ์ ์๋ค. (๊ฐ์ ์๊ฐ์ ๋์ฐฉํ๋ฉด ์ฝ์ ์ฐ์ ์์๊ฐ ๋ฐ๋ฆฌ๊ธฐ ๋๋ฌธ)
if crew_arrival[0] > last_time: # ํ ์์์ ํฌ๋ฃจ๊ฐ ๋ง์ง๋ง ๋ฒ์ค๋ณด๋ค ๋ฆ๊ฒ ๋์ฐฉํ๋๊น ์ด์ฐจํผ ๋ชป ํ
return minToHour(last_time) # ๋ง์ง๋ง ๋ฒ์ค ๋์ฐฉ ์๊ฐ๊น์ง ๋์ฐฉํ๋ฉด ๋๋ค
return minToHour(crew_arrival[m-1]-1) # ๋ง์ง๋ง์ผ๋ก ๋ฒ์ค์ ํ์นํ๋ ํฌ๋ฃจ๋ณด๋ค 1๋ถ ๋จผ์
๐ ์ฐธ๊ณ ์๋ฃ
https://geonlee.tistory.com/39
'๐ซ ETC > Problem Solving' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] ๊ณผ์ ์งํํ๊ธฐ (0) | 2023.09.27 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] ์์ (0) | 2023.09.25 |
[ํ๋ก๊ทธ๋๋จธ์ค] ํผ์ ๋๊ธฐ์ ๋ฌ์ธ (0) | 2023.09.22 |
[BOJ] 3460. ์ด์ง์ (0) | 2023.09.22 |
[BOJ] 2501. ์ฝ์ ๊ตฌํ๊ธฐ (0) | 2023.09.20 |