[BOJ][๐ก5][๋ฐฑ์ค#16928] ๋ฑ๊ณผ ์ฌ๋ค๋ฆฌ ๊ฒ์
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold V
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
๋ฑ๊ณผ ์ฌ๋ค๋ฆฌ ๊ฒ์์ ์ฆ๊ฒจ ํ๋ ํ๋ธ๋ฌ๋ฒ๋ ์ด๋ ๋ ๊ถ๊ธํ ์ ์ด ์๊ฒผ๋ค.
์ฃผ์ฌ์๋ฅผ ์กฐ์ํด ๋ด๊ฐ ์ํ๋ ์๊ฐ ๋์ค๊ฒ ๋ง๋ค ์ ์๋ค๋ฉด, ์ต์ ๋ช ๋ฒ๋ง์ ๋์ฐฉ์ ์ ๋์ฐฉํ ์ ์์๊น?
๊ฒ์์ ์ ์ก๋ฉด์ฒด ์ฃผ์ฌ์๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์ฃผ์ฌ์์ ๊ฐ ๋ฉด์๋ 1๋ถํฐ 6๊น์ง ์๊ฐ ํ๋์ฉ ์ ํ์๋ค. ๊ฒ์์ ํฌ๊ธฐ๊ฐ 10ร10์ด๊ณ , ์ด 100๊ฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ ๋ณด๋ํ์์ ์งํ๋๋ค. ๋ณด๋ํ์๋ 1๋ถํฐ 100๊น์ง ์๊ฐ ํ๋์ฉ ์์๋๋ก ์ ํ์ ธ ์๋ค. ํ๋ ์ด์ด๋ ์ฃผ์ฌ์๋ฅผ ๊ตด๋ ค ๋์จ ์๋งํผ ์ด๋ํด์ผ ํ๋ค. ์๋ฅผ ๋ค์ด, ํ๋ ์ด์ด๊ฐ i๋ฒ ์นธ์ ์๊ณ , ์ฃผ์ฌ์๋ฅผ ๊ตด๋ ค ๋์จ ์๊ฐ 4๋ผ๋ฉด, i+4๋ฒ ์นธ์ผ๋ก ์ด๋ํด์ผ ํ๋ค. ๋ง์ฝ ์ฃผ์ฌ์๋ฅผ ๊ตด๋ฆฐ ๊ฒฐ๊ณผ๊ฐ 100๋ฒ ์นธ์ ๋์ด๊ฐ๋ค๋ฉด ์ด๋ํ ์ ์๋ค. ๋์ฐฉํ ์นธ์ด ์ฌ๋ค๋ฆฌ๋ฉด, ์ฌ๋ค๋ฆฌ๋ฅผ ํ๊ณ ์๋ก ์ฌ๋ผ๊ฐ๋ค. ๋ฑ์ด ์๋ ์นธ์ ๋์ฐฉํ๋ฉด, ๋ฑ์ ๋ฐ๋ผ์ ๋ด๋ ค๊ฐ๊ฒ ๋๋ค. ์ฆ, ์ฌ๋ค๋ฆฌ๋ฅผ ์ด์ฉํด ์ด๋ํ ์นธ์ ๋ฒํธ๋ ์๋ ์๋ ์นธ์ ๋ฒํธ๋ณด๋ค ํฌ๊ณ , ๋ฑ์ ์ด์ฉํด ์ด๋ํ ์นธ์ ๋ฒํธ๋ ์๋ ์๋ ์นธ์ ๋ฒํธ๋ณด๋ค ์์์ง๋ค. ๊ฒ์์ ๋ชฉํ๋ 1๋ฒ ์นธ์์ ์์ํด์ 100๋ฒ ์นธ์ ๋์ฐฉํ๋ ๊ฒ์ด๋ค. ๊ฒ์ํ์ ์ํ๊ฐ ์ฃผ์ด์ก์ ๋, 100๋ฒ ์นธ์ ๋์ฐฉํ๊ธฐ ์ํด ์ฃผ์ฌ์๋ฅผ ๊ตด๋ ค์ผ ํ๋ ํ์์ ์ต์๊ฐ์ ๊ตฌํด๋ณด์.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๊ฒ์ํ์ ์๋ ์ฌ๋ค๋ฆฌ์ ์ N(1 โค N โค 15)๊ณผ ๋ฑ์ ์ M(1 โค M โค 15)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ์ฌ๋ค๋ฆฌ์ ์ ๋ณด๋ฅผ ์๋ฏธํ๋ x, y (x < y)๊ฐ ์ฃผ์ด์ง๋ค. x๋ฒ ์นธ์ ๋์ฐฉํ๋ฉด, y๋ฒ ์นธ์ผ๋ก ์ด๋ํ๋ค๋ ์๋ฏธ์ด๋ค. ๋ค์ M๊ฐ์ ์ค์๋ ๋ฑ์ ์ ๋ณด๋ฅผ ์๋ฏธํ๋ u, v (u > v)๊ฐ ์ฃผ์ด์ง๋ค. u๋ฒ ์นธ์ ๋์ฐฉํ๋ฉด, v๋ฒ ์นธ์ผ๋ก ์ด๋ํ๋ค๋ ์๋ฏธ์ด๋ค. 1๋ฒ ์นธ๊ณผ 100๋ฒ ์นธ์ ๋ฑ๊ณผ ์ฌ๋ค๋ฆฌ์ ์์ ๋๋ ๋์ด ์๋๋ค. ๋ชจ๋ ์นธ์ ์ต๋ ํ๋์ ์ฌ๋ค๋ฆฌ ๋๋ ๋ฑ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ๋์์ ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ๋ ์๋ค. ํญ์ 100๋ฒ ์นธ์ ๋์ฐฉํ ์ ์๋ ์ ๋ ฅ๋ง ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
100๋ฒ ์นธ์ ๋์ฐฉํ๊ธฐ ์ํด ์ฃผ์ฌ์๋ฅผ ์ต์ ๋ช ๋ฒ ๊ตด๋ ค์ผ ํ๋์ง ์ถ๋ ฅํ๋ค.
์์
์์ 1
์ ๋ ฅ
3 7
32 62
42 68
12 98
95 13
97 25
93 37
79 27
75 19
49 47
67 17
์ถ๋ ฅ
3
์์ 2
์ ๋ ฅ
4 9
8 52
6 80
26 42
2 72
51 19
39 11
37 29
81 3
59 5
79 23
53 7
43 33
77 21
์ถ๋ ฅ
5
My Sol
from collections import deque
L, S = map(int, input().split())
Ls = [0]*101
Ss = [0]*101
v = [0xffffff]*101
for _ in range(L):
s, e = map(int, input().split())
Ls[s] = e
for _ in range(S):
s, e = map(int, input().split())
Ss[s] = e
Q = deque()
Q.append(1)
v[1] = 0
cnt = 1
l = 1
while v[100]==0xffffff:
for _ in range(l):
n = Q.popleft()
l -= 1
for k in range(1, 7):
s = n+k
if s > 100: continue
if v[s] <= cnt: continue
# ๋ฐ์ ์๋ฆฌ์ ๋ฑ์ด ์๋ค๋ฉด
if Ss[s]:
if v[Ss[s]] > cnt:
v[Ss[s]] = cnt
Q.append(Ss[s])
l += 1
continue
# ํ์ ์์น์ cnt๋ฅผ ์ง์ ํ๊ณ , Q์ ์ขํ ์ถ๊ฐ
v[s] = cnt
Q.append(s)
l += 1
# ๋ฐ์ ์๋ฆฌ์ ์ฌ๋ค๋ฆฌ๊ฐ ์๊ณ , ์ฌ๋ค๋ฆฌ๋ฅผ ํ๊ณ ์ฌ๋ผ๊ฐ ๊ณณ์ v๊ฐ cnt๋ณด๋ค ํฌ๋ค๋ฉด
if Ls[s] and v[Ls[s]] > cnt:
# cnt๋ฅผ ์ถ๊ฐํ๊ณ ์ขํ ์ถ๊ฐ
v[Ls[s]] = cnt
Q.append(Ls[s])
l += 1
cnt += 1
print(v[100])
BFS ์ต๋จ๊ฒฝ๋ก ๋ฐฉ์์ ์ด์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํ์๋ค. ๋ฑ๊ณผ ์ฌ๋ค๋ฆฌ์ ์ถ๋ฐ์ ์ ์ธ๋ฑ์ค๋ก ํ๊ณ , ๋์ฐฉ์ ์ ๊ฐ์ผ๋ก ํ๋ Ss, Ls ๋ฐฐ์ด์ ๋ง๋ค๊ณ 0์ผ๋ก ์ด๊ธฐํํ๋ค. ์ ๋ ฅ์ ๋ฐ์ ๋ฐฐ์ด์ ์ฒ๋ฆฌํด์ค๋ค.
๋ฐฉ๋ฌธ ์ฒดํฌ ๋ฐฐ์ด v๋ฅผ ํฐ ๊ฐ์ผ๋ก ์ด๊ธฐํํ๊ณ , ์์์ ์ธ 1์ ์นด์ดํธ 0์ผ๋ก ํ์ํ๊ธฐ ์ํด v[1] = 0์ ํ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ cnt๋ง๋ค ์ด๋ํ ์ ์๋ ์ขํ๋ฅผ ๊ณ์ฐํด Q์ ๋ฃ์ผ๋ฉฐ, Q์ ๊ธธ์ด๋งํผ ํญ๋ชฉ์ ๋นผ์ ์์์ ์ ์ก๊ณ 1๋ถํฐ 6๊น์ง ์ด๋ํ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ชจ๋ ๊ตฌํ๋ค.
ํ์ ์ขํ๋ 100์ ๋์ ์ ์์ผ๋ฉฐ, ์ด๋ฏธ ์ง๋๊ฐ ์๋ฆฌ์ด๋ฉด์ cnt๋ณด๋ค ์์ ๊ฒฝ์ฐ๋ ์ด๋ฏธ ์ต์๊ฒฝ๋ก๋ฅผ ๋ฐ์ ๊ฒ์ด๋ฏ๋ก ๊ฐฑ์ ํ ํ์ ์์ด ๋์ด๊ฐ๋ค.
๋ง์ฝ ๋ฐ์ ์๋ฆฌ์ ๋ฑ์ด ์๋ค๋ฉด ๋ ๋์๊ฐ์ง ๋ชปํ๋๋ฐ, ๋ฑ์ ๋ฐ์ ๋ฏธ๋๋ฌ์ง ๋์ฐฉ์ ์ v๊ฐ cnt๋ณด๋ค ํฌ๋ค๋ฉด cnt๋ฅผ ๊ฐฑ์ ํ๊ณ Q์ ๋ฃ์ด์ฃผ๋ฉด ๋๊ณ , v๊ฐ ๋ ์๋ค๋ฉด ๊ทธ๋๋ก ๋์ด๊ฐ๋ฉด ๋๊ฒ ๋ค. ๋ฑ์ ๋ฏธ๋๋ฌ์ ธ ๋ด๋ ค๊ฐ๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก๋ v๊ฐ cnt๋ณด๋ค ๋ ์์ ๊ฒ์ด๋ค.
๋ง์ฝ ๊ทธ๋ ์ง ์๋ค๋ฉด ๋ฑ์ด ์๋ ์ผ๋ฐ ์นธ์ด๋ ์ฌ๋ค๋ฆฌ๋ฅผ ๋ฐ๋ ๊ฒฝ์ฐ์ผํ ๋ฐ, ๋ ๊ฒฝ์ฐ ๋ชจ๋ ์นธ ์์ฒด๋ cnt๋ก ๊ฐฑ์ ํ๊ณ Q์ ์ขํ๋ฅผ ์ถ๊ฐํด์ฃผ๋๋ฐ, ์ฌ๋ค๋ฆฌ์ธ ๊ฒฝ์ฐ ์์ชฝ์ผ๋ก ์ด๋ํ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํ๋ค. ๋ง์ฝ ์ฌ๋ค๋ฆฌ์ด๊ณ , ์ฌ๋ค๋ฆฌ์ ๋์ฐฉ์ ์ v๊ฐ์ด cnt๋ณด๋ค ํฌ๋ค๋ฉด ๋์ฐฉ์ ๋ cnt๋ก ๊ฐฑ์ ํ๊ณ , ๋์ฐฉ์ ์ ์ขํ๋ Q์ ์ถ๊ฐํด์ค๋ค.
์ด ๋ชจ๋ ์ผ๋ จ์ ๊ณผ์ ์ด ๋๋๋ฉด cnt๋ฅผ 1 ์ฌ๋ฆฌ๋ฉฐ ๋ค์ ์ด๋์ ์๊ฐํด์ค๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋ชจ๋ฒ๋ต์
from collections import deque
n,m = map(int,input().split())
dic = {}
for _ in range(n+m):
a,b = map(int,input().split())
dic[a] = b
def search ():
visited = [False for _ in range(101)]
visited[1] = True
q = deque()
q.append((1,0))
while q:
idx,cnt = q.popleft()
if idx == 100:
return cnt
break
for i in range(1,7):
next_ = idx+i
if next_ > 100 : continue
if visited[next_] : continue
visited[next_] = True
if next_ in dic:
next_ = dic[next_]
visited[next_]
q.append((next_,cnt+1))
print(search())
์คํ์๊ฐ๋ ์ํญ ์ฐจ์ด๋๊ณ , ์ฝ๋๊ฐ ์ ๋ฐ์ ๋๋ฐ์ ๋์ง ์์ ์ฝ๋๋ฅผ ์ฐพ์ ๊ฐ์ ธ์๋ณด์๋ค.
๋ฑ๊ณผ ์ฌ๋ค๋ฆฌ์ ๊ตฌ๋ถ์ ๋์ง ์๊ณ , dictionary์ ๋ชจ๋ ๋ฃ์๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์์์ ์ key๋ก, ๋์ฐฉ์ ์ ๊ฐ์ผ๋ก ๋์๋ค.
๋๋ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ๋ ๋ฐฉ์์ผ๋ก ์์ฑํ๋๋ฐ, ์ด ๋ถ์ BFS๋ฐฉ์์ผ๋ก visit ํ๋ ๊ณณ์ด๋ผ๋ฉด passํ๋ ๋ฐฉ์์ ์ด์ฉํ์๋ค. ์ด๋๋ ๋๋๊ฑด๊ฐ?
ํ์ ์ขํ๊ฐ 100์ด ๋๋ฉด Q์ ์์์ ๊ณผ ํจ๊ป ์ ์ฅํด๋ cnt๋ฅผ ๋ฐํํด ์ถ๋ ฅํ๋ค. ํ์ ์ขํ๊ฐ visitํ๋ ๊ณณ์ด๋ฉด ๋์ด๊ฐ๋ค. ์ด๋๋ถํฐ ํ์ ์ขํ๋ฅผ visit ์ฒ๋ฆฌํ๊ณ , ๋ฑ์ฌ๋ค๋ฆฌ ๋์ ๋๋ฆฌ์ key์ ํ์ ์ขํ๊ฐ ์๋ค๋ฉด ๋์ฐฉ์ ๋ visited ์ฒ๋ฆฌํ๋ค. ๋ฑ์ด๋ ์ฌ๋ค๋ฆฌ์ด๋ ๋์ฐฉ์ ์ ์ฒดํฌ๋๋ ๊ฒ์ด ๋์ผํ๊ณ , ๋ง์ฝ ์ด๋ฏธ ์ฒดํฌ๊ฐ ๋์ด์์ด๋ ์๊ด์ ์๋ค. Q์ cnt๋ฅผ 1 ์ถ๊ฐํด์ ๋ฃ์ด์ฃผ๋๋ฐ, ๋ฑ์ด๋ ์ฌ๋ค๋ฆฌ๋ฅผ ๋ฐ์ผ๋ฉด ๋์ฐฉ์ ์ ์ขํ๋ฅผ ์ํฅ/ํํฅ๋ ๊ฐ์ผ๋ก ๊ฐฑ์ ํด ๋ฃ๋๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ