https://school.programmers.co.kr/learn/courses/30/lessons/176962
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
โ๏ธ ๋ฌธ์ ์์ฝ
- `plans`๋ ์๊ฐ ์์ผ๋ก ์ ๋ ฌ๋์ด ์์ง ์์ ์ ์๋ค.
- ๋ฉ์ถฐ๋ ๊ณผ์ ๊ฐ ์ฌ๋ฌ ๊ฐ์ผ ๊ฒฝ์ฐ, ๊ฐ์ฅ ์ต๊ทผ์ ๋ฉ์ถ ๊ณผ์ ๋ถํฐ ์์ํ๋ค.
๐ค ์ ๊ทผ๋ฒ
`done`: ์๋ฃํ ์์๋๋ก ๊ณผ์ ์ด๋ฆ์ ์ ์ฅํ ๋ฆฌ์คํธ
`stack`: ์๋ฃํ์ง ๋ชปํ๊ณ ๋ฉ์ถ ๊ณผ์ ๋ฅผ ๋ด์๋ ๋ฆฌ์คํธ
`plans`๋ฅผ ์ํํ๋ฉฐ ๊ฐ๊ฐ์ ๊ณผ์ ์ ๋ํด ์๋์ฒ๋ผ ๋ถ๊ธฐํ๋ค.
- ๊ณผ์ ๋ฅผ ์๋ฃํ์ง ๋ชปํ ๊ฒฝ์ฐ (`start + playtime`์ด ๋ค์ ๊ณผ์ ์ ์์ ์๊ฐ๋ณด๋ค ํฐ ๊ฒฝ์ฐ)
- ์์ฌ ์๊ฐ(`playtime`)์ ๊ฐฑ์ ํ์ฌ ๋๊ธฐ์ด(`stack`)์ ์ถ๊ฐ
- ๊ณผ์ ๋ฅผ ์๋ฃํ ๊ฒฝ์ฐ (`start + playtime`์ด ๋ค์ ๊ณผ์ ์ ์์ ์๊ฐ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฒฝ์ฐ)
- `done`์ ์ถ๊ฐํ๋ค.
- ๋ค์ ๊ณผ์ ์์ ์ ๊น์ง ์๊ฐ์ด ๋จ๋ ๊ฒฝ์ฐ
- ๋๊ธฐ์ด(`stack`)์ ๊ฐ์ฅ ์ต๊ทผ์ ์ ์ฅ๋ ๊ณผ์ ๋ฅผ ์งํ
- ๋๊ธฐ์ด ๊ณผ์ ๋ฅผ ์๋ฃํ ๊ฒฝ์ฐ `done`์ ์ถ๊ฐ
- ๋๊ธฐ์ด ๊ณผ์ ๋ฅผ ์๋ฃํ์ง ๋ชปํ ๊ฒฝ์ฐ ์์ฌ ์๊ฐ(`playtime`)์ ๊ฐฑ์ ํ์ฌ ๋๊ธฐ์ด(`stack`)์ ์ถ๊ฐ
- ๊ฐ์ฅ ๋ง์ง๋ง์ ์งํํ๋ ๊ณผ์ ๋ ๋ฌด์กฐ๊ฑด `done`์ ์ถ๊ฐ
- `plans`๋ฅผ ๋ชจ๋ ์ํํ๊ณ ๋๊ธฐ์ด(`stack`)์ ๋จ์์๋ ๊ณผ์ ๋, `pop()`ํ์ฌ ๋ง์ง๋ง ์์๋ถํฐ `done`์ ์ถ๊ฐ
๐ช ๋ฌด์ํ๊ฒ ํ๊ธฐ
์๋๋ ์ ํ์ฑ์ด ๋ฎ์ ์ฝ๋์ด๋ค. ๊ทธ ์๋ ์ ํ์ฑ์ ๋์ธ ์ฝ๋์์ ์ธ๋ถ ๋ก์ง์ ์ค๋ช ํ๊ฒ ๋ค.
def hourToMin(str):
hh, mm = map(int, str.split(':'))
return hh * 60 + mm
def solution(plans):
done = [] # ์๋ฃํ ๊ณผ์
stack = [] # ๋ฉ์ถ ๊ณผ์ ๋ฆฌ์คํธ (๊ฐ์ฅ ์ต๊ทผ๋ถํฐ ๋ค์ ํ๋ค)
plans.sort(key=lambda x:x[1])
now = 0 # ํ์ฌ ์๊ฐ
for i in range(len(plans)-1):
cur_nm, cur_st, cur_pt = plans[i][0], hourToMin(plans[i][1]), int(plans[i][2])
next_st = hourToMin(plans[i+1][1])
if cur_st + cur_pt > next_st: # ๋ค ๋ชป ๋๋ด๊ณ ๋๊ธฐ์ด์ ๋ฃ์ด์ผ ํ๋ค
stack.append([cur_nm, cur_st + cur_pt - next_st]) # ํํ์ ๋ณ๊ฒฝ ๋ชปํจ
now = next_st
elif cur_st + cur_pt == next_st: # ๋ค ๋๋ผ ์ ์์ง๋ง ๋๊ธฐ์ด์ ์๋ ๊ณผ์ ๋ ๋ชปํ๋ค
done.append(cur_nm)
now = next_st
else: # ๋ค ๋๋ด๊ณ ๋๊ธฐ์ด์ ์๋ ๊ณผ์ ๋ ์ ๊น ํ๋ค
done.append(cur_nm)
now = cur_st + cur_pt
while stack:
if now + stack[-1][1] <= next_st: # ๋ค ํ ์ ์๋ค
done.append(stack.pop()[0]) # ๊ณผ์ ์ด๋ฆ๋ง append
else: # ์ผ๋ถ๋ง ํ๋ค -> ๋๊ธฐ์ด ๊ณผ์ ๋จ์ ์๊ฐ ๊ฐฑ์
stack[-1][1] = now + stack[-1][1] - next_st
break
# ๋งจ ๋ง์ง๋ง ๊ณผ๋ชฉ
done.append(plans[-1][0])
# ๋๊ธฐ์ด์์ ํ๋์ฉ ๋ฝ์์ ์ ๋ต ๋ฆฌ์คํธ์ ์ด์ด๋ถ์ธ๋ค.
while stack:
done.append(stack.pop()[0]) # ๊ณผ์ ์ด๋ฆ๋ง append
return done
๐ฏ ์ ํ์ฑ ๋์ด๊ธฐ
์ ์ฒด ์ฝ๋
def hourToMin(str):
hh, mm = map(int, str.split(':'))
return hh * 60 + mm
def solution(plans):
done = [] # ์๋ฃํ ๊ณผ์
stack = [] # ๋ฉ์ถ ๊ณผ์ ๋ฆฌ์คํธ (๊ฐ์ฅ ์ต๊ทผ๋ถํฐ ๋ค์ ํ๋ค)
plans.sort(key=lambda x:x[1])
for i in range(len(plans)):
if i == len(plans) - 1: # ๋งจ ๋ง์ง๋ง ๊ณผ์ ๋ ๋ฌด์กฐ๊ฑด ํ๋ค
done.append(plans[i][0])
break
name, start, pt = plans[i][0], hourToMin(plans[i][1]), int(plans[i][2])
nStart = hourToMin(plans[i+1][1]) # ๋ค์ ๊ณผ์ ์์ ์๊ฐ
if start + pt > nStart: # ๋ค ๋ชป ๋๋ด๊ณ ๋๊ธฐ์ด์ ๋ฃ์ด์ผ ํ๋ค
stack.append([name, (start+pt)-nStart]) # ํํ์ ๋ณ๊ฒฝ ๋ชปํจ
else: # ๋ค ๋๋ผ ์ ์๋ค
done.append(name)
remaining = nStart - (start + pt) # ๋ค์ ๊ณผ์ ์์ ์ ๊น์ง ๋จ์ ์๊ฐ
while remaining != 0 and stack: # ๋ค ๋๋ด๊ณ ๋๊ธฐ์ด์ ์๋ ๊ณผ์ ๋ ์ ๊น ํ๋ค
nn, pp = stack.pop() # ๋๊ธฐ์ด์ ์๋ name, playtime
if remaining >= pp: # ๋๊ธฐ์ด ๊ณผ์ ๋ฅผ ๋ง์น ์ ์๋ ๊ฒฝ์ฐ
done.append(nn)
remaining -= pp
else: # ์ผ๋ถ๋ง ํ๊ณ ๋ค์ ๋๊ธฐ์ด์ ๋ฃ๋๋ค
stack.append([nn, pp - remaining])
remaining = 0
# ๋๊ธฐ์ด์์ ์์๋๋ก popํ์ฌ done ๋ฆฌ์คํธ์ ์ถ๊ฐ
while stack:
done.append(stack.pop()[0]) # ๊ณผ์ ์ด๋ฆ๋ง append
return done
์ธ๋ถ ์ค๋ช
์ฐ์ , `plans` ๋ฆฌ์คํธ๋ ์ ๋ ฌ๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์ `๊ณผ์ ์์ ์๊ฐ`์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ์ ํด์ผ ํ๋ค.
plans.sort(key=lambda x:x[1])
์ด์ `plans`๋ฅผ ์ํํ๋ฉด์, ์์์ ์ธ๊ธํ ๋ถ๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํด์ผ ํ๋ค.
์ฐ์ , ๋งจ ๋ง์ง๋ง ๊ณผ์ ๋ ๋ค์ ๊ณผ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ฌด์กฐ๊ฑด ๋๋ง์น ์ ์๋ค.
๋ฐ๋ผ์ ๋งจ ๋ง์ง๋ง ๊ณผ์ ๋ `done` ๋ฆฌ์คํธ์ ๋ฃ๊ณ ๋ฐ๋ณต๋ฌธ์ ์ข ๋ฃํ๋ฉด ๋๋ค.
for i in range(len(plans)):
if i == len(plans) - 1: # ๋งจ ๋ง์ง๋ง ๊ณผ์ ๋ ๋ฌด์กฐ๊ฑด ํ๋ค
done.append(plans[i][0])
break
`plans`์ ์์๋ `[name, start, playtime]`์ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ์๋ฅผ ๋ค๋ฉด, `["korean", "11:40", "30"]`์ ํํ์ด๋ค.
์ด๋ start๋ "๋ถ" ํํ๋ก ๋ณ๊ฒฝํ๊ณ , playtime์ ๊ธฐ์กด ๋ฌธ์์ด์์ ์ ์ํ์ผ๋ก ๋ณ๊ฒฝํด์ผ ๊ณ์ฐํ ์ ์๋ค.
๊ณผ์ ๋ฅผ ๋ง์น ์ ์๋์ง ๊ณ์ฐํ๊ธฐ ์ํด ๋ค์ ๊ณผ์ ์ ์์์๊ฐ(`nStart`)๋ ํ์ํ๋ค.
name, start, pt = plans[i][0], hourToMin(plans[i][1]), int(plans[i][2])
nStart = hourToMin(plans[i+1][1]) # ๋ค์ ๊ณผ์ ์์ ์๊ฐ
...
def hourToMin(str):
hh, mm = map(int, str.split(':'))
return hh * 60 + mm
๊ณผ์ ๋ฅผ ๋ง์น ์ ์๋ค๋ฉด, ํ ์ ์๋ ๋งํผ๋ง ํ๊ณ `playtime`์ ๊ฐฑ์ ํ ๋ค ๋๊ธฐ์ด(`stack`)์ ์ถ๊ฐํ๋ค.
์ด๋ ํํ์ด ์๋๋ผ ๋ฆฌ์คํธ ํํ๋ก ์ ์ฅํ๋ ์ด์ ๋, ๋์ค์ ๋๊ธฐ์ด์ ์๋ ๊ณผ์ ๋ค์ `playtime`์ ๊ฐฑ์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
if start + pt > nStart: # ๋ค ๋ชป ๋๋ด๊ณ ๋๊ธฐ์ด์ ๋ฃ์ด์ผ ํ๋ค
stack.append([name, (start+pt)-nStart])
๊ณผ์ ๋ฅผ ๋ง์น ์ ์๋ค๋ฉด ๋ ๊ฐ์ง ๊ฒฝ์ฐ์ ์๊ฐ ์กด์ฌํ๋ค.
1) ํ์ฌ ๊ณผ์ ๋ง ๋ง์น ์ ์๋ ๊ฒฝ์ฐ
2) ํ์ฌ ๊ณผ์ ๋ฅผ ๋ง์น๊ณ ๋ค์ ๊ณผ์ ์์ ์ ๊น์ง ๋๊ธฐ์ด์ ๊ณผ์ ๋ฅผ ์๋ ์ ์๋ ๊ฒฝ์ฐ
์ ๋๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ํ๋จํ๊ธฐ ์ํด ๋ค์ ๊ณผ์ ์์ ์ ๊น์ง ๋จ์ ์๊ฐ(`remaining`)์ ๊ณ์ฐํ๋ค.
๋จ์ ์๊ฐ์ด ์์ผ๋ฉด์ ๋๊ธฐ์ด(`stack`)์ ๊ณผ์ ๊ฐ ์๋ค๋ฉด, 2๋ฒ์ ๊ฒฝ์ฐ๋ก ๋๊ธฐ์ด์ ๊ณผ์ ๊น์ง (ํ ์ ์๋ ๋งํผ) ํ๋ค.
else: # ๊ณผ์ ๋ฅผ ๋ง์น ์ ์๋ ๊ฒฝ์ฐ
done.append(name)
remaining = nStart - (start + pt) # ๋ค์ ๊ณผ์ ์์ ์ ๊น์ง ๋จ์ ์๊ฐ
while remaining != 0 and stack: # ๋ค ๋๋ด๊ณ ๋๊ธฐ์ด์ ์๋ ๊ณผ์ ๋ ์ ๊น ํ๋ค
nn, pp = stack.pop() # ๋๊ธฐ์ด์ ์๋ name, playtime
if remaining >= pp: # ๋๊ธฐ์ด ๊ณผ์ ๋ฅผ ๋ง์น ์ ์๋ ๊ฒฝ์ฐ
done.append(nn)
remaining -= pp
else: # ์ผ๋ถ๋ง ํ๊ณ ๋ค์ ๋๊ธฐ์ด์ ๋ฃ๋๋ค
stack.append([nn, pp - remaining])
remaining = 0
๋ง์ง๋ง์ผ๋ก, `plans` ์ํ๋ฅผ ๋ง์ณค๋ค๋ฉด ๋๊ธฐ์ด์ ๋จ์ ๊ณผ์ ๋ฅผ ์์๋๋ก `pop()`ํ์ฌ ๋๋ด๋ฉด ๋๋ค.
# ๋๊ธฐ์ด์์ ์์๋๋ก popํ์ฌ done ๋ฆฌ์คํธ์ ์ถ๊ฐ
while stack:
done.append(stack.pop()[0]) # ๊ณผ์ ์ด๋ฆ๋ง append
๐ ๋ค๋ฅธ ์ฌ๋์ ์ฝ๋๋ฅผ ํ๊ตฌํด๋ณด๊ธฐ
์ ์ฒด ์ฝ๋
def hourToMin(str):
hh, mm = map(int, str.split(':'))
return hh * 60 + mm
def solution(plans):
# plans = sorted(map(lambda x: [x[0], hourToMin(x[1]), int(x[2])], plans), key=lambda x: -x[1])
plans = map(lambda x: [x[0], hourToMin(x[1]), int(x[2])], plans)
plans = sorted(plans, key=lambda x: x[1], reverse=True)
done = []
while plans:
name, start, playtime = plans.pop()
for i, x in enumerate(done):
if x[0] > start:
done[i][0] += playtime
done.append([start + playtime, name]) # [๊ณผ์ ๋ฅผ ๋ง์น ์๊ฐ, ์ด๋ฆ]
done.sort()
return list(map(lambda x: x[1], done))
์ธ๋ถ ์ค๋ช
๊ฐ์ฅ ํต์ฌ์ ์๋ ์ฝ๋์ด๋ค.
- `x`: ์ด๋ฏธ ์๋ฃ๋ ๊ณผ์ ๋ค ์ค ํ๋
- `x[0]`: ํด๋น ์ด์ ๊ณผ์ ๊ฐ ๋๋ ์๊ฐ
- `start`: ํ์ฌ ์ฒ๋ฆฌ ์ค์ธ ๊ณผ์ ์ ์์ ์๊ฐ
- `playtime`: ํ์ฌ ์ฒ๋ฆฌ ์ค์ธ ๊ณผ์ ์ ์์ ์๊ฐ
๋ฐ๋ผ์ `if x[0] > start:`๋ ํ์ฌ ์ฒ๋ฆฌ ์ค์ธ ๊ณผ์ ์ ์์ ์๊ฐ(`start`)์ ์ด์ ์ ์๋ฃ๋ ๊ณผ์ (`x`)์ ๋๋ ์๊ฐ(`x[0]`)์ ๋น๊ตํ๋ค.
๋ง์ฝ, `x[0]`์ด `start`๋ณด๋ค ํฌ๋ค๋ฉด, ์ด์ ์ ์๋ฃ๋ ๊ณผ์ `x`์ ํ์ฌ ์ฒ๋ฆฌ ์ค์ธ ๊ณผ์ ๊ฐ ์ค์ฒฉ๋๋ ๊ฒฝ์ฐ๋ค.
์ค์ฒฉ๋ ๊ฒฝ์ฐ์๋ ์ด์ ๊ณผ์ ์ ๋๋ ์๊ฐ(`done[i][0]`)์ ์ ๋ฐ์ดํธ ํ์ฌ ํ์ฌ ์ฒ๋ฆฌ ์ค์ธ ๊ณผ์ ๊ฐ ๋๋ ์ดํ๋ก ์๊ฐ์ ๋ํด์ค๋ค.
for i, x in enumerate(done):
if x[0] > start:
done[i][0] += playtime
๐ ์ฐธ๊ณ ์๋ฃ
'๐ซ ETC > Problem Solving' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SWEA] 2001. ํ๋ฆฌ ํด์น (DP) (2) | 2023.11.09 |
---|---|
[๊นํ์ ์๊ณ ๋ฆฌ์ฆ] ์ฌ๊ณผ๋๋ฌด (BFS) (0) | 2023.11.07 |
[ํ๋ก๊ทธ๋๋จธ์ค] ์์ (0) | 2023.09.25 |
[ํ๋ก๊ทธ๋๋จธ์ค] [1์ฐจ] ์ ํ๋ฒ์ค (0) | 2023.09.23 |
[ํ๋ก๊ทธ๋๋จธ์ค] ํผ์ ๋๊ธฐ์ ๋ฌ์ธ (0) | 2023.09.22 |