2023 KAKAO BLIND RECRUITMENT - Lv2.
๐ต ๋ฌธ์
https://school.programmers.co.kr/learn/courses/30/lessons/150369
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
๐ ํ์ด
์ฒ์์๋ O(N^2) ์ ๋์ ํ์ด๋ฐ์ ์๊ฐ์ด ์๋ฌ๋๋ฐ, input์ธ n ๋ฒ์ ๋ณด๋๊น ๊ฐ์ด ์๋์ค๋๋ผ๊ณ ์.. ๊ทธ๋์ ์ข ๊ฒฐ์ด ๋ค๋ฅด๊ธด ํ์ง๋ง ์๋ ๊ตฌ๋ช ๋ณดํธ ๋ฌธ์ ํผ ๊ฒ์ฒ๋ผ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์น๊ตฌ, task๊ฐ ๋ค ํด๊ฒฐ๋ ์น๊ตฌ๋ฅผ ํ๋์ฉ ๋ณด๋ด์ฃผ๋ (์ ๊ฒฝ๊บผ์ฃผ๋) ๊ทธ๋ฆฌ๋ํ ๋ฐฉ์์ ์ด๋จ๊น ์๊ฐํ์ต๋๋ค.
[ํ๋ก๊ทธ๋๋จธ์ค] ๊ตฌ๋ช ๋ณดํธ - Python
(2022๋ 4์ ๊ฒฝ ์์ฑ๋ ๊ธ์ ๋๋ค.) ๋ฌธ์ ์ฝ๋ฉํ ์คํธ ์ฐ์ต - ๊ตฌ๋ช ๋ณดํธ ๋ฌด์ธ๋์ ๊ฐํ ์ฌ๋๋ค์ ๊ตฌ๋ช ๋ณดํธ๋ฅผ ์ด์ฉํ์ฌ ๊ตฌ์ถํ๋ ค๊ณ ํฉ๋๋ค. ๊ตฌ๋ช ๋ณดํธ๋ ์์์ ํ ๋ฒ์ ์ต๋ 2๋ช ์ฉ ๋ฐ์ ํ ์ ์๊ณ , ๋ฌด
lerryroad.tistory.com
์ผ๋จ ํธ๋ญ์ ์๋์ ๋ ๊ฝ๊ฝ ๋ด๊ณ ๋ค๋๋ค๊ณ ์๊ฐํ๊ณ , ๊ฐ์ฅ ๋จผ ์ง๋ถํฐ ์ดํด๋ด ๋๋ค.
๋งจ ๋ ์ง์ ๋ฐฐ๋ฌ๊ณผ ์๊ฑฐ๊ฐ ๋๋๊ธฐ ์ํด์ ๋ช ๋ฒ ์๋ค๊ฐ๋ค ํด์ผํ๋์ง ์ฒดํฌํฉ๋๋ค. ์ด๋ฅผ deliver_cnt์ pickup_cnt๋ก ๋๊ณ ๋ฐ๋ณต๋ฌธ์ ๋๋ฆฌ๋๋ฐ, ๋ฐฐ๋ฌ ์๋๊ณผ ์๊ฑฐ ์๋์ด ๊ฐ๊ฐ ๋ชจ๋ ์์ง๋์์ ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ข ๋ฃ์กฐ๊ฑด์ ๋์ต๋๋ค. ํ์ ์ฒดํฌ๋ฅผ ์ํจ์ด๋๊น ์ค์ ์๋์์ ๋นผ๋ฒ๋ฆฌ๋ฉด ์๋๋๊น, temp๋ ๋์ต๋๋ค. (์๋์ ์๊ฐํ๊ธฐ ํธํ๋ผ๊ณ ๋จ์ deliver ์๋์ ์์๋ก, ๋จ์ pickup ์๋์ ์์๋ก ๊ด๋ฆฌํ๊ณ , ์์ง๋๋ ์กฐ๊ฑด ์ฒดํฌ๋ deliver ์๋์ 0๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๋ + pickup ์๋์ 0๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๋๋ก ์ค์ ํ์ต๋๋ค.)
๊ทธ๋ฆฌ๊ณ ๋์ ๋์จ deliver_cnt์ pickup_cnt ์ค ๋ ํฐ ๊ฐ (๋ ๋ค task๊ฐ ์์ง๋์ด์ผ ํ๊ธฐ ๋๋ฌธ) ์ ์ ํํด ๋งจ ๋ ์ง์์์ ์ด๋ ํ์๋ฅผ ๊ฒฐ์ ํ๊ณ (cnt), ๋งจ ๋ ์ง์ ์ ๋ณตํ๊ธฐ๊น์ง์ ์ด๋ ๊ฑฐ๋ฆฌ๋ฅผ ์ด ๊ฑฐ๋ฆฌ์ ๋ํด์ค๋๋ค. (distance += (i + 1) * cnt * 2) ์๋ค ๊ฐ๋ค๊ฐ ํ ์ธํธ๋๊น ๊ณฑํ๊ธฐ 2๋ ํด์ค๋๋ค.
for๋ฌธ ๋ด๋ถ์์ remain_deliver๊ณผ remain_pickup์ 0์ผ๋ก ์ด๊ธฐํํด์ฃผ์ง ์๊ณ ๊ธฐ์กด ๊ฐ์ ๊ทธ๋๋ก ์ฐ๋ ๊ฑด, ๋จ์ ๋ฌผํ์ ์ค๋ ๊ธธ์ ์ฑ์ฐ๊ฑฐ๋ ์๊ฑฐํ๊ณ ์ฌ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ ๊ฒ ๊ฐ์ฅ ์ผํฐ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ง๊น์ง ๋๊ณ ๋๋ฉด ์ด๋ํ ์ต์๊ฑฐ๋ฆฌ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๐ก ํ์ด ์ฝ๋๋ ์๋์ ๊ฐ์ต๋๋ค.
def solution(cap, n, deliveries, pickups):
distance = 0 # ์ต์ข
๊ฑฐ๋ฆฌ
remain_deliver = 0
remain_pickup = 0
for i in range(n - 1, -1, -1): # ๊ฐ์ฅ ๋จผ ์ง๋ถํฐ ์ ๋ณต
remain_deliver += deliveries[i] # ํ์ฌ ๋ณด๊ณ ์๋ ์ง ๊น์ง์ ๋จ์ ๋ฐฐ๋ฌ ์, ์์๋ก ๊ด๋ฆฌ
remain_pickup -= pickups[i] # ํ์ฌ ๋ณด๊ณ ์๋ ์ง ๊น์ง์ ๋จ์ ์๊ฑฐ ์, ์์๋ก ๊ด๋ฆฌ
deliver_cnt = 0
pickup_cnt = 0
temp_deliver = remain_deliver # deliver count ์ฒดํฌ๋ฅผ ์ํ ์์ remain_deliver
temp_pickup = remain_pickup # pickup count ์ฒดํฌ๋ฅผ ์ํ ์์ remain_pickup
# ํ์ฌ ๋ณด๊ณ ์๋ ์ง์ task ๊ฐ ์์ง ๋๊ธฐ ๊น์ง์ ๊ณผ์ , 0 ๊ธฐ์ค ์กฐ๊ฑด ๋ง์กฑ (์์ง)
while True:
if temp_deliver <= 0:
break
temp_deliver -= cap
deliver_cnt += 1
while True:
if temp_pickup >= 0:
break
temp_pickup += cap
pickup_cnt += 1
# cnt: ์ฒ๋ฆฌ ํด์ผ ํ๋ ๋จ์ ๋ฌผํ ์์ด ๋ค๋
์์ผ ํ๋ ํ์, ๋ ์ค ๋ ํฐ ์๋ก ๊ฒฐ์
cnt = max(deliver_cnt, pickup_cnt)
remain_deliver -= cnt * cap
remain_pickup += cnt * cap
distance += (i + 1) * cnt * 2 # ๊ฑฐ๋ฆฌ ๋ํ๊ธฐ (์๋ณต)
return distance