[BOJ][๐ก1][๋ฐฑ์ค#01194] ๋ฌ์ด ์ฐจ์ค๋ฅธ๋ค, ๊ฐ์.
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold I
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
์ง๊ธ ๋ฏผ์์ด๊ฐ ๊ณํํ ์ฌํ์ ๋ฌ์ด ๋งจ ์ฒ์ ๋จ๊ธฐ ์์ํ ๋ ๋ถํฐ, ์ค๋นํ๋ ์ฌํ๊ธธ์ด๋ค. ํ์ง๋ง, ๋งค๋ฒ ๋ฌ์ด ์ฐจ์ค๋ฅผ ๋๋ง๋ค ๋ฏผ์์ด๋ ์ด์ฉ ์ ์๋ ํ์ค์ ๋ฒฝ ์์์ ๋ค์ง์ ํฌ๊ธฐํ๊ณ ๋ง์๋ค. ๋ฏผ์์ด๋ ๋งค๋ฒ ์์ ์ ๋ค์ง์ ๋งํ๋ ค๊ณ ๋ ธ๋ ฅํ์ง๋ง, ๋ง์ ํ๋ฉด ์๋ฌด๋ ๋ชป ์์๋ค์ ๊ฒ๋ง ๊ฐ์์, ์ง๋ ๊ฒ๋จน๊ณ ๋ฒ์ด๋ฆฌ๊ฐ ๋์ด๋ฒ๋ ธ๋ค. ๊ฒฐ๊ตญ ๋ฏผ์์ด๋ ๋ชจ๋ ์ ๋ ์๋ฒฝ ๋ค์ ๋ฐ์ฏค ํ๋ก ์ผ์ด๋, ์ฐฝ ๋ฐ์ ๋ ์๋ ๋ฌ์ ๋ณด์๋ค. ํ๋ฃจ๋ฐ์ ๋จ์ง ์์๋ค. ๋ฌ์ ๋ด์ผ์ด๋ฉด ๋ค ์ฐจ์ค๋ฅธ๋ค. ์ด๋ฒ์ด ๋ง์ง๋ง๊ธฐํ๋ค. ์ด๊ฑธ ๋์น๋ฉด ์์ ๋ชป๊ฐ๋ค. ์์์ด๋ ๋ฏผ์์ด๊ฐ ์ค๋๋ ์ฌํ๊ฒ์ฒ๋ผ ๊ทธ๋ฅ ์ ๋ค์ด๋ฒ๋ ค์ ๋ชป ๊ฐ์ง๋ ๋ชจ๋ฅธ๋ค๊ณ ์๊ฐํ๋ค. ํ์ง๋ง ๊ทธ๋ฌ๊ธฐ์ ๋ฏผ์์ด์ ๋์๋ ์ ๊ธฐ ๋ฌ ๋ฌ์ด ๋๋ฌด๋ ๋จ๋ ธ๋ค. ๋ฏผ์์ด๋ ์ง๊ธ ๋ฏธ๋ก ์์ ์๋ค. ๋ฏธ๋ก๋ ์ง์ฌ๊ฐํ ๋ชจ์์ด๊ณ , ์ฌํ๊ธธ์ ๋ ๋๊ธฐ ์ํด ๋ฏธ๋ก๋ฅผ ํ์ถํ๋ ค๊ณ ํ๋ค. ๋ฏธ๋ก๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ๋์ด์ ธ์๋ค.
๋น ์นธ: ์ธ์ ๋ ์ด๋ํ ์ ์๋ค. (โ.โ) ๋ฒฝ: ์ ๋ ์ด๋ํ ์ ์๋ค. (โ#โ) ์ด์ : ์ธ์ ๋ ์ด๋ํ ์ ์๋ค. ์ด ๊ณณ์ ์ฒ์ ๋ค์ด๊ฐ๋ฉดย ์ด์ ๋ฅผ ์ง๋๋ค. (โaโ, โbโ, โcโ, โdโ, โeโ, โfโ) ๋ฌธ: ๋์ํ๋ ์ด์ ๊ฐ ์์ ๋๋ง ์ด๋ํ ์ ์๋ค. (โAโ, โBโ, โCโ, โDโ, โEโ, โFโ) ๋ฏผ์์ด์ ํ์ฌ ์์น: ๋น ๊ณณ์ด๊ณ , ๋ฏผ์์ด๊ฐ ํ์ฌ ์ ์๋ ๊ณณ์ด๋ค. (โ0โ) ์ถ๊ตฌ: ๋ฌ์ด ์ฐจ์ค๋ฅด๊ธฐ ๋๋ฌธ์, ๋ฏผ์์ด๊ฐ ๊ฐ์ผํ๋ ๊ณณ์ด๋ค. ์ด ๊ณณ์ ์ค๋ฉด ๋ฏธ๋ก๋ฅผ ํ์ถํ๋ค. (โ1โ)
๋ฌ์ด ์ฐจ์ค๋ฅด๋ ๊ธฐํ๋ฅผ ๋์น์ง ์๊ธฐ ์ํด์, ๋ฏธ๋ก๋ฅผ ํ์ถํ๋ ค๊ณ ํ๋ค. ํ ๋ฒ์ ์์ง์์ ํ์ฌ ์์น์์ ์ํ์ด๋ ์์ง์ผ๋ก ํ ์นธ ์ด๋ํ๋ ๊ฒ์ด๋ค. ๋ฏผ์์ด๊ฐ ๋ฏธ๋ก๋ฅผ ํ์ถํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์ด๋ ํ์์ ์ต์๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋ฏธ๋ก์ ์ธ๋ก ํฌ๊ธฐ N๊ณผ ๊ฐ๋ก ํฌ๊ธฐ M์ด ์ฃผ์ด์ง๋ค. (1 โค N, M โค 50) ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๋ฏธ๋ก์ ๋ชจ์์ด ์ฃผ์ด์ง๋ค. ๊ฐ์ ํ์ ์ ์ด์ ๊ฐ ์ฌ๋ฌ ๊ฐ ์์ ์ ์๊ณ , ๋ฌธ๋ ๋ง์ฐฌ๊ฐ์ง์ด๋ค. ๊ทธ๋ฆฌ๊ณ ,ย ๋ฌธ์ ๋์ํ๋ ์ด์ ๊ฐ ์์ ์๋ ์๋ค. โ0โ์ ํ ๊ฐ, โ1โ์ ์ ์ด๋ ํ ๊ฐ ์๋ค.ย ์ด์ ๋ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ ์ ์๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๋ฏผ์์ด๊ฐ ๋ฏธ๋ก๋ฅผ ํ์ถํ๋๋ฐ ๋๋ ์ด๋ ํ์์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค. ๋ง์ฝ ๋ฏผ์์ด๊ฐ ๋ฏธ๋ก๋ฅผ ํ์ถ ํ ์ ์์ผ๋ฉด, -1์ ์ถ๋ ฅํ๋ค.
์์
์์ 1
์ ๋ ฅ
1 7
f0.F..1
์ถ๋ ฅ
7
์์ 2
์ ๋ ฅ
5 5
....1
#1###
.1.#0
....A
.1.#.
์ถ๋ ฅ
-1
์์ 3
์ ๋ ฅ
7 8
a#c#eF.1
.#.#.#..
.#B#D###
0....F.1
C#E#A###
.#.#.#..
d#f#bF.1
์ถ๋ ฅ
55
์์ 4
์ ๋ ฅ
3 4
1..0
###.
1...
์ถ๋ ฅ
3
์์ 5
์ ๋ ฅ
3 5
..0..
.###.
..1.A
์ถ๋ ฅ
6
์์ 6
์ ๋ ฅ
4 5
0....
.#B#A
.#.#.
b#a#1
์ถ๋ ฅ
19
์์ 7
์ ๋ ฅ
1 11
c.0.C.C.C.1
์ถ๋ ฅ
12
์์ 8
์ ๋ ฅ
3 6
###...
#0A.1a
###...
์ถ๋ ฅ
-1
My Sol
from collections import deque
def main():
def find_begin():
for i in range(I):
for j in range(J):
if mat[i][j] =='0': return i, j
def check_visits(visits, i, j):
return visits | (2**(i*I+j))
def check_has_key(C, keys):
return keys & (2**(ord(C)-65))
def register_key(c, keys):
return keys | (2**(ord(c)-97))
def bfs():
Q = deque([(bi, bj, 0, 0, 0)])
while Q:
i, j, keys, visits, moves = Q.popleft()
if keys in visit[i][j]: continue
checked_visits = check_visits(visits, i, j)
visit[i][j].add(keys)
for di, dj in ((-1,0),(1,0),(0,1),(0,-1)):
si, sj = i+di, j+dj
if not (0<=si<I and 0<=sj<J): continue
if mat[si][sj] =='0':
Q.append((si, sj, keys, checked_visits, moves+1))
elif mat[si][sj] == '1': return moves+1
elif mat[si][sj] == '#': continue
elif mat[si][sj] == '.':
Q.append((si, sj, keys, checked_visits, moves+1))
else:
if mat[si][sj].isupper():
if not check_has_key(mat[si][sj], keys): continue
Q.append((si, sj, keys, checked_visits, moves+1))
else:
new_keys = register_key(mat[si][sj], keys)
Q.append((si, sj, new_keys, checked_visits, moves+1))
return -1
I, J = map(int, input().split())
mat = [list(input()) for _ in range(I)]
bi, bj = find_begin()
visit = [[set() for _ in range(J)] for _ in range(I)]
return bfs()
print(main())
๋นํธ๋ง์คํน๊ณผ BFS๋ฅผ ํ์ฉํ์ฌ ํด๊ฒฐํ๋ ๋ฌธ์ ์๋ค. ์ด์ , ๊ทธ๋ฆฌ๊ณ ๊ฐ ๊ฒฝ์ฐ๋ง๋ค visited๋ฅผ ๋นํธ๋ง์คํน์ผ๋ก ์ ์ฅํด Queue์ ๋ฃ์๋ค.
- ๊ฐ๋ก์ธ๋ก ๊ธธ์ด์ ๊ฒฉ์๋ฅผ input์ผ๋ก ๋ฐ์ ์ ์ฅํ๋ค.
find_begin
ํจ์๋ฅผ ํตํด 0์ ์ขํ๋ฅผ ์ฐพ์ ์ ์ฅํ๋ค.- 2์ฐจ์ ๋ฐฐ์ด
visit
์ ์ด๊ธฐํํ๋ค. ๋นํธ๋ง์คํน ์ฒ๋ฆฌํkey
๋ฅผ ๊ฐ set์ ์ถ๊ฐํ๋๋ฐ, ์ด๋ ๊ฐ์ key๋ฅผ ๋ค๊ณ ์ฌ๋ฐฉ๋ฌธํ๋ค๋ฉด ์ดํ ์ด๋์ ์ํ๋ ๋ฐฉ์์ผ๋กvisit
์ ํ์ฉํ์๋ค. - BFS๋ฅผ ์์ํ๋ค. deque์ ๋ค์ด๊ฐ๋ ๊ฐ ์์๋ ์ขํ(i, j), ๋นํธ๋ง์คํนํ ์ด์ ๋ค(keys)๊ณผ ๋ฐฉ๋ฌธํ๋ ๊ณณ(visits), ๊ทธ๋ฆฌ๊ณ ์ด๋ ํ์(moves)๋ฅผ ์ ์ฅํ๋ค.
visit
2์ฐจ์ ๋ฐฐ์ด์ ํ์ฌ ์ขํ์ ํ์ฌ keys๋ฅผ ๋ค๊ณ ๋ฐฉ๋ฌธํ ์ ์ด ์์ผ๋ฉด ๋์ด๊ฐ๊ณ , ์๋๋ผ๋ฉด keys๋ฅผ ๋ฑ๋กํ๋ค. ์ด๋ฅผcheck_visits
ํจ์๋ฅผ ํตํด ๊ตฌํํ๋ค.- ํ ์ขํ์์ ์ฌ๋ฐฉ์ ํ์ธํ์๋๋ฐ, ๋ง์ฝ ํ์ธํ๋ ์ขํ(si, sj)์ ๊ฐ์ด 1์ด๋ผ๋ฉด ํ์ถ์ด๋ฏ๋ก ํ์ฌ๊น์ง์ ์ด๋ ํ์(moves)์ 1์ ๋ํด returnํ๋ค. #์ ์ง๋๊ฐ ์ ์๊ธฐ ๋๋ฌธ์ ๋์ด๊ฐ๊ณ , ๋ง์ฝ 0์ด๋ .๋ผ๋ฉด ๊ทธ๋ฅ ์ง๋๊ฐ ์ ์๋๋ก ํ๋ค. ๋งํ๊ฑฐ๋ ํ์ธํ ๊ฒ์ด ์๋ ์ง์ญ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ด์ธ์ ๊ฒฝ์ฐ์๋ ์ํ๋ฒณ, ์ฆ ์ด์ ๋ ๋ฌธ์ด๋ฏ๋ก ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํด ๋ถ๊ธฐ์ฒ๋ฆฌํ๋ค. ๋ง์ฝ ๋๋ฌธ์๋ฅผ ๋ง์ฃผํ๋ค๋ฉด, ํ์ฌ ํด๋นํ๋ ๋๋ฌธ์์ ์๋ฌธ์๊ฐ ํค๋ฅผ ๊ฐ์ง๊ณ ์๋์ง๋ฅผ ์ฒดํฌํ๋ค. ์ด๋ฅผ
check_has_key
ํจ์๋ก ๊ตฌํํ์ผ๋ฉฐ,keys
์์ฒด๊ฐ ๋นํธ๋ง์คํน ์ฒ๋ฆฌ๋์ด์์ผ๋ฏ๋ก ๋ง์ฐฌ๊ฐ์ง๋ก ๋นํธ ๋ฐฉ์์ผ๋ก ํ์ธํ๋ค. key๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง deque์ ๋ค์ ์ด๋์ ์ถ๊ฐํ๋ฉด ๋์๋ค. - ๋ง์ฝ ์๋ฌธ์๋ฅผ ๋ง์ฃผํ๋ค๋ฉด, ํ์ฌ
keys
์ ํด๋น ์ํ๋ฒณ์ key๋ฅผ ์ถ๊ฐํ๋ค. ์ด๋ฅผregister_key
๋ก ๊ตฌํํ์ผ๋ฉฐ ๋ง์ฐฌ๊ฐ์ง๋ก ๋นํธ ๋ฐฉ์์ผ๋ก ์ถ๊ฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ์ด๋์ ์ถ๊ฐํ๋ฉด ๋์๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ