๐ฉ๐ปโ๐ป๋ฌธ์ ์ค๋ช
[์ด์ฝํ
Ch12-14] ์ธ๋ฒฝ ์ ๊ฒ (๊ตฌํ)
โ๏ธIdea Sketch
๋ฌธ์ ์์ฝ
์ธ๋ฒฝ์ ๊ธธ์ด n, ์ทจ์ฝ ์ง์ ์ ์์น๊ฐ ๋ด๊ธด ๋ฐฐ์ด weak, ๊ฐ ์น๊ตฌ๊ฐ 1์๊ฐ ๋์ ์ด๋ํ ์ ์๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ด๊ธด ๋ฐฐ์ด dist๊ฐ ๋งค๊ฐ๋ณ์๋ก ์ฃผ์ด์ง ๋, ์ทจ์ฝ ์ง์ ์ ์ ๊ฒํ๊ธฐ ์ํด ๋ณด๋ด์ผ ํ๋ ์น๊ตฌ ์์ ์ต์๊ฐ์ return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
weak : ๋ฐ๋์ ๋ฐฉ๋ฌธํด์ผํ๋ ์ง์
dist : ํ๋ฒ์ ์ด๋ํ ์ ์๋ ๊ฑฐ๋ฆฌ
์ ํ์ฌํญ
n์ 1 ์ด์ 200 ์ดํ์ธ ์์ฐ์
weak์ ๊ธธ์ด๋ 1 ์ด์ 15 ์ดํ
weak์ ์์๋ 0 ์ด์ n - 1 ์ดํ์ธ ์ ์
dist์ ๊ธธ์ด๋ 1 ์ด์ 8 ์ดํ
dist์ ์์๋ 1 ์ด์ 100 ์ดํ์ธ ์์ฐ์
weak๋ฅผ ๋ชจ๋ ๋ฐฉ๋ฌธํ ์ ์๋ ๊ฒฝ์ฐ, return -1
์๊ฐ๋ณต์ก๋ : O(n!), ์๊ณ ๋ฆฌ์ฆ : ๋ธ๋ฃจํธํฌ์ค (์์ ํ์)
์ฒ์์๋ ๊ทธ๋ฆฌ๋๋ก ์ ๊ทผํ๋ ค ํ๋ค. ํ์ง๋ง, weak์ dist ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ ๋งค์ฐ ์์ ์์ ํ์๋ ๊ณ ๋ คํด๋ณผ๋ง ํ๋ค. ์น๊ตฌ์ ์๊ฐ ์ต๋ 8๋ช ์ด๋ฏ๋ก ์ด๋ค์ ํฌ์ ์์๋ฅผ ์ ํ๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ 8!, ์ฝ 40000์ด๋ค. (์์ด)
์น๊ตฌ ํฌ์ ์์๋ฅผ ์ ํ์ผ๋, ์ฒซ๋ฒ์งธ ์น๊ตฌ๋ฅผ ์ด๋ ์ทจ์ฝ์ง์ ์ ํฌ์ ์ํฌ์ง (์ถ๋ฐ ์ง์ ) ์ ํ๋ฉด ๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ฌด์กฐ๊ฑด weak์ ๋ฐฐ์ด ์์๋๋ก ๋ฐฉ๋ฌธํ๋ฉด, 0m์ ๊ฐ๋ก์ง๋ฌ ์ฌ๋ฌ ์ง์ ์ ๋ฐฉ๋ฌธํ๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ ์ ์๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ์ทจ์ฝ์ง์ ์ด ์ถ๋ฐ์ง๊ฐ ๋ ์ ์๋ค.
์ทจ์ฝ์ ์ ์ต๋ 15๊ฐ์ด๋ฏ๋ก ์๊ฐ๋ณต์ก๋๋ ์ฝ 40000 * 15 ์ด๋ค.
์๊ฐ๋ณต์ก๋๋ ๊ฐ์ฅ ๋์ ์ฐจ์์ ํญ๋ง์ ํ์ํ๋ ๊ฒ์ด ์ฝ์์ด๋ฏ๋ก O(n!)์ด๋ค.
์ค์ ์์ด๋์ด
- ์์ ํ์
- ์ธ๋ฒฝ ํ์ฅ
โ๏ธ๋ด ์์ค์ฝ๋
- graph : 0m ์ง์ ์ผ๋ก ๋ค์ ๋์์ค๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ์ฌ weak๋ฅผ n * 2๋ก ํ์ฅํ๋ค.
- permutations : ์น๊ตฌ๋ฅผ ํฌ์ ํ๋ ์์๋ฅผ ๊ตฌํ๋ค. (์์ด)
- start์ for๋ฌธ : ๋ชจ๋ ์ทจ์ฝ์ง์ ์ ์ถ๋ฐ์ง์ ์ด ๋ ์ ์๋ค.
from itertools import permutations
def solution(n, weak, dist):
W, D = len(weak), len(dist)
graph = weak + [w + n for w in weak] # weak ๋ฐฐ์ด 2๋ฐฐ ํ์ฅ (0m๋ก ๋์์ค๋ ๊ฒฝ์ฐ)
res = float('inf')
for friends in permutations(dist): # ํฌ์
์์ (์์ด)
for start in range(W): # ์ฒซ๋ฒ์งธ ํฌ์
index
end = start - 1 + W # weak ํ์ฅํ์ผ๋ฏ๋ก + W
p = graph[start]
cnt = 1
for friend in friends:
p += friend
if p < graph[end]:
cnt += 1
for x in graph:
if p < x:
p = x
break
else:
res = min(res, cnt)
break
if res == float('inf'):
return -1
else:
return res