[BOJ][๐ก3][๋ฐฑ์ค#02479] ๊ฒฝ๋ก ์ฐพ๊ธฐ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold III
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
๊ธธ์ด๊ฐ ๊ฐ์ ๋ ๊ฐ์ ์ด์ง์ ์ฝ๋ A์ B๊ฐ ์๋ค๊ณ ํ์. ์ด ๋ ์ฝ๋ ์ฌ์ด์ ํด๋ฐ ๊ฑฐ๋ฆฌ๋ A์ B์ ๊ฐ ๋นํธ๋ฅผ ์ผ์ชฝ๋ถํฐ ์ค๋ฅธ์ชฝ์ผ๋ก ์ฐจ๋ก๋๋ก ๋น๊ตํ ๋ ์๋ก ๋ค๋ฅธ ๊ฐ์ ๊ฐ์ง ๋นํธ์ ์์ด๋ค. ์๋ฅผ ๋ค์ด, A=010010, B=011011 ์ด๋ผ๊ณ ํ๋ฉด, ์ธ ๋ฒ์งธ ๋นํธ์ ์ฌ์ฏ ๋ฒ์งธ ๋นํธ๋ง ์๋ก ๋ค๋ฅด๋ฏ๋ก ์ด ๋ ์ฝ๋ ์ฌ์ด์ ํด๋ฐ ๊ฑฐ๋ฆฌ๋ 2์ด๋ค. ์ฐ๋ฆฌ๋ ์ด N๊ฐ์ ์ด์ง ์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ๊ฐ ์ฝ๋์ ๊ธธ์ด๋ K๋ก ๊ฐ๋ค. ์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ด ๊ธธ์ด๊ฐ 3์ธ 5๊ฐ์ ์ด์ง ์ฝ๋๋ค์ด ์๋ค.
A=000 B=111 C=010 D=110 E=001
๋ ์ฝ๋ A์ B์ฌ์ด์ ํด๋ฐ ๊ฑฐ๋ฆฌ๋ฅผ H(A,B)๋ก ํํํ๋ค. ๊ทธ๋ฌ๋ฉด, H(A,B)=3, H(A,C)=1, H(A,D)=2, H(A,E)=1 ์ด๋ค. ์ฐ๋ฆฌ๋ ์ด์ง ์ฝ๋๋ค์ ๋ํด ํด๋ฐ ๊ฒฝ๋ก๋ฅผ ์ฐพ๊ณ ์ ํ๋ค. ํด๋ฐ ๊ฒฝ๋ก๋ ๋ชจ๋ ์ธ์ ํ ๋ ์ฝ๋์ฌ์ด์ ํด๋ฐ ๊ฑฐ๋ฆฌ๊ฐ 1์ธ ๊ฒฝ๋ก์ด๋ค. ์์ ์์์ (A,C,D)๋ ์ฝ๋ A์ C์ ํด๋ฐ ๊ฑฐ๋ฆฌ๊ฐ 1์ด๊ณ , ์ฝ๋ C์ D์ ํด๋ฐ ๊ฑฐ๋ฆฌ๊ฐ 1์ด๋ฏ๋ก ํด๋ฐ ๊ฒฝ๋ก์ด๋ค. (A,E,B)๋ ์ฝ๋ A์ E์ ํด๋ฐ ๊ฑฐ๋ฆฌ๋ 1์ด์ง๋ง, ์ฝ๋ E์ B์ ํด๋ฐ ๊ฑฐ๋ฆฌ๊ฐ 2์ด๋ฏ๋ก ํด๋ฐ ๊ฒฝ๋ก๊ฐ ์๋๋ค. ์ด ๋ฌธ์ ๋ ์ฃผ์ด์ง ๋ ์ฝ๋ ์ฌ์ด์ ๊ฐ์ฅ ์งง์ ํด๋ฐ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๊ฒ์ด๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์๋ ๋ ๊ฐ์ ์ ์ N๊ณผ K๊ฐ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋ค(3 โค N โค 1,000, 2 โค K โค 30). ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ๊ฐ ์ค๋ง๋ค ๊ธธ์ด๊ฐ K์ธ ์ด์ง ์ฝ๋๊ฐ ํ๋์ฉ ์ฃผ์ด์ง๋ค. ํ๋์ ์ฝ๋๋ ๋น์นธ์ด ์์ด ์ฃผ์ด์ง๋ค. ์ฝ๋๋ค์ ์ฃผ์ด์ง ์์๋๋ก 1๋ถํฐ N๊น์ง์ ๋ฒํธ๋ก ๊ตฌ๋ถ๋๋ค. ์ฝ๋๊ฐ ๊ฐ์ ๊ฒฝ์ฐ๋ ์๋ค. ๊ทธ ๋ค์ ์ค์๋ ํด๋ฐ ๊ฒฝ๋ก๋ฅผ ์ฐพ๊ณ ์ ํ๋ ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ ์ฝ๋ A์ B๊ฐ ๊ฐ๊ฐ์ ์ฝ๋๋ฒํธ๋ก ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง ๋ ์ฝ๋ ์ฌ์ด์ ํด๋ฐ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋ฉด ๊ทธ ๊ฒฝ๋ก ์ค ๊ฐ์ฅ ์งง์ ๊ฒฝ๋ก๋ฅผ ์ฝ๋ A๋ถํฐ ์ฝ๋ B๊น์ง ๊ฒฝ๋ก์์ ์ฝ๋ ๋ฒํธ๋ก ์ถ๋ ฅํ๋ค. ์ฝ๋ ๋ฒํธ๋ฅผ ์ถ๋ ฅํ ๊ฒฝ์ฐ์๋ ์ฝ๋ ๋ฒํธ ์ฌ์ด์ ํ๋์ ๋น์นธ์ ์ฌ์ด์ ๋๊ณ ์ถ๋ ฅํ๋ค. ๋ง์ฝ ๋ต์ด ์ฌ๋ฌ ๊ฐ ์์ผ๋ฉด ๊ทธ ์ค์ ํ๋๋ง ์ถ๋ ฅํ๊ณ , ๊ฒฝ๋ก๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด -1์ ์ถ๋ ฅํ๋ค.
์์
์ ๋ ฅ
5 3
000
111
010
110
001
1 2
์ถ๋ ฅ
1 3 4 2
My Sol
import sys
input = sys.stdin.readline
from collections import deque
T, L = map(int, input().split())
arr = []
for _ in range(T):
arr.append(int(input()[::-1], 2))
mat = []
for i in range(T):
num = 0
for j in range(T):
cnt = 0
for k in range(L):
if (arr[i]^arr[j]) & (1<<k):
cnt += 1
if cnt==2:
cnt = 0
break
num += (1<<j)*cnt
mat.append(num)
for i in range(L):
mat[i] &= ~(1<<i)
S, E = map(int, input().split())
S, E = S-1, E-1
paths = deque()
paths.append([S])
Q = deque()
Q.append(S)
v = 0
while not v & (1<<E) and Q:
s = Q.popleft()
path = paths.popleft()
for i in range(T):
if v&(1<<i): continue
if not mat[s]&(1<<i): continue
v ^= (1<<i)
if i==E:
path += [i]
for n in path:
print(n+1, end=' ')
quit()
Q.append(i)
paths.append(path+[i])
print(-1)
์๊ฐ๊ณผ ์ฉ๋์ ๊ทน์ ์ผ๋ก ์ค์ด๊ธฐ ์ํด visited, mat 2์ฐจ์ ๋ฐฐ์ด ๋ฑ ์ฒดํฌ์ฉ์ผ๋ก ์ฌ์ฉํ๋ ๊ฐ์ฉํ ๋ชจ๋ ๊ฒ์ ๋นํธํ์์ผ๋ก ์์ฑํ์๋ค.
์ต์ด 1๊ณผ0์ผ๋ก ์ด๋ฃจ์ด์ง ์ ๋ ฅ ํ ์คํธ๋ฅผ ๋ฐ์ ํ์ฌ int(,2)๋ฅผ ์ด์ฉํด 2์ง์๋ฅผ 10์ง์๋ก ๋ณํํด ์ ์ฅํ๊ณ , ์ด ๊ฐ๊ฐ์ ์ธ๋ฑ์ค์ ๋ง์ถฐ ์๋ก ์ฐ๊ฒฐ๋์ด ์๋์ง ๋นํธ๋ฅผ ํตํด ์ฒดํฌํ์๋ค.
์๊ธฐ ์ค์ค๋ก์๋ ๋งํฌ๋ ์ ์์ผ๋ฏ๋ก mat[i] &= ~(1<<i)
๋ฅผ index๋ง๋ค ์์ฑํ์ฌ 0์ผ๋ก ๋ง๋ค์ด์ฃผ์๋ค.
Q๋ฅผ ์ด์ฉํด ์์์ ์์์ ์ ๋ฝ์๋ด๊ณ , ์ดํ ์์์ ๊ณผ ์ฐ๊ฒฐ๋ ์ ๋ค์ ํ๋ํ๋ ํ์ธํด ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด ๋ฐฉ๋ฌธ ์ฒดํฌ๋ฅผ ํ๋ค.
์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํด์ผํ๋ฏ๋ก BFS๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์ ๊ฒ ๊ฐ์๋ฐ, ๊ฒฝ๋ก๋ฅผ ์ด๋ป๊ฒ ์ฒดํฌํด์ผํ ๊น ํ๋ค๊ฐ Q์ ๊ฐ์ด ๋์ํ๋ paths ๋ฐฐ์ด์ ๋ง๋ค์ด popleftํ์ฌ ์์์ ์ ๋์ฐฉ์ ์ ๋ด์ append ํ๋ ๋ฐฉ์์ผ๋ก Q์ ์์๋ฅผ ๋ง์ถฐ์ฃผ์๋ค. ๋๋ฌธ์ Q์์ ๊บผ๋ธ ์์์ ๊ณผ ์ฐ๊ฒฐ๋ ์ ์ด ๋์ฐฉ์ ์ด ์๋ค๋ฉด, ํจ๊ป ๊บผ๋ด์จ path์ ๋์ฐฉ์ ๊น์ง ๋ฃ์ด์ ์ถ๋ ฅํด์ฃผ๋ฉด ๋๊ฒ ๋ค.
๊ฒฝ๋ก๋ ์ธ๋ฑ์ค ๋๋ฌธ์ ์ถ๋ ฅํด์ผ ํ๋ ํ์๋ณด๋ค 1์ฉ ์์ผ๋ฏ๋ก for๋ฌธ์ ์ด์ฉํด 1์ฉ ํค์์ ์ถ๋ ฅํด์ฃผ์๋ค. ๋ง์ฝ Q๊ฐ ๋๋ ๋๊น์ง ์ถ๋ ฅํ์ง ๋ชปํ๋ฉด, -1์ ์ถ๋ ฅํ๊ณ ๋ง์น๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋ชจ๋ฒ๋ต์
# 2479 ๊ฒฝ๋ก์ฐพ๊ธฐ
from sys import stdin
import sys
from collections import defaultdict
def dfs(now, road):
if now == e:
print(*road)
sys.exit()
for i in range(k):
temp = list(ham[now])
temp[i] = str(abs(1- int(temp[i])))
temp = ''.join(temp)
if temp in ham and ham[temp][0] == 0:
ham[temp][0] = 1
dfs(ham[temp][1], road + [ham[temp][1]])
ham[temp][0] = 0
n, k = map(int, stdin.readline().split())
ham = defaultdict(list)
for i in range(n):
ham[i+1] = ''.join(list(stdin.readline().rstrip()))
ham[ham[i+1]] = [0, i+1]
s, e = map(int, stdin.readline().split())
dfs(s, [s])
print(-1)
์ฝ๋๊ธธ์ด๊ฐ ์งง์์ ๊ฐ์ ธ์จ ํ์ด์ด๋ค. ๋๋ BFS๋ฅผ ์ด์ฉํ๋๋ฐ, ์ด ๋ถ์ DFS๋ฅผ ์ด์ฉํด ํธ์ จ๋ค. defaultdict๋ผ๋ ๋ชจ๋์ importํด ์ฌ์ฉํ์ จ๋ค. ๋์ ๋๋ฆฌ์ ํ ์ข ๋ฅ์ธ ๊ฒ ๊ฐ๋ค. ๊ฒฝ๋ก ์ค์ ์ ์ธ์๋ก ๋ฃ์ด์ ๋งค๋ฒ ์ ๋ฌํด์ฃผ์๋๋ฐ๋ ์๋๊ฐ ๋นจ๋๋ค. visited ์ฒดํฌ๋ฅผ ๋์ ๋๋ฆฌ๋ก ํน์ดํ๊ฒ ํ์ จ๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ