[BOJ][๐ŸŸก1][๋ฐฑ์ค€#01194] ๋‹ฌ์ด ์ฐจ์˜ค๋ฅธ๋‹ค, ๊ฐ€์ž.

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #1194


๋ฌธ์ œ

์ง€๊ธˆ ๋ฏผ์‹์ด๊ฐ€ ๊ณ„ํšํ•œ ์—ฌํ–‰์€ ๋‹ฌ์ด ๋งจ ์ฒ˜์Œ ๋œจ๊ธฐ ์‹œ์ž‘ํ•  ๋•Œ ๋ถ€ํ„ฐ, ์ค€๋น„ํ–ˆ๋˜ ์—ฌํ–‰๊ธธ์ด๋‹ค. ํ•˜์ง€๋งŒ, ๋งค๋ฒˆ ๋‹ฌ์ด ์ฐจ์˜ค๋ฅผ ๋•Œ๋งˆ๋‹ค ๋ฏผ์‹์ด๋Š” ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ํ˜„์‹ค์˜ ๋ฒฝ ์•ž์—์„œ ๋‹ค์ง์„ ํฌ๊ธฐํ•˜๊ณ  ๋ง์•˜๋‹ค. ๋ฏผ์‹์ด๋Š” ๋งค๋ฒˆ ์ž์‹ ์˜ ๋‹ค์ง์„ ๋งํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์ง€๋งŒ, ๋ง์„ ํ•˜๋ฉด ์•„๋ฌด๋„ ๋ชป ์•Œ์•„๋“ค์„ ๊ฒƒ๋งŒ ๊ฐ™์•„์„œ, ์ง€๋ ˆ ๊ฒ๋จน๊ณ  ๋ฒ™์–ด๋ฆฌ๊ฐ€ ๋˜์–ด๋ฒ„๋ ธ๋‹ค. ๊ฒฐ๊ตญ ๋ฏผ์‹์ด๋Š” ๋ชจ๋‘ ์ž ๋“  ์ƒˆ๋ฒฝ ๋„ค์‹œ ๋ฐ˜์ฏค ํ™€๋กœ ์ผ์–ด๋‚˜, ์ฐฝ ๋ฐ–์— ๋– ์žˆ๋Š” ๋‹ฌ์„ ๋ณด์•˜๋‹ค. ํ•˜๋ฃจ๋ฐ–์— ๋‚จ์ง€ ์•Š์•˜๋‹ค. ๋‹ฌ์€ ๋‚ด์ผ์ด๋ฉด ๋‹ค ์ฐจ์˜ค๋ฅธ๋‹ค. ์ด๋ฒˆ์ด ๋งˆ์ง€๋ง‰๊ธฐํšŒ๋‹ค. ์ด๊ฑธ ๋†“์น˜๋ฉด ์˜์˜ ๋ชป๊ฐ„๋‹ค. ์˜์‹์ด๋Š” ๋ฏผ์‹์ด๊ฐ€ ์˜ค๋Š˜๋„ ์—ฌํƒœ๊ฒƒ์ฒ˜๋Ÿผ ๊ทธ๋ƒฅ ์ž  ๋“ค์–ด๋ฒ„๋ ค์„œ ๋ชป ๊ฐˆ์ง€๋„ ๋ชจ๋ฅธ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋Ÿฌ๊ธฐ์—” ๋ฏผ์‹์ด์˜ ๋ˆˆ์—๋Š” ์ €๊ธฐ ๋œฌ ๋‹ฌ์ด ๋„ˆ๋ฌด๋‚˜ ๋–จ๋ ธ๋‹ค. ๋ฏผ์‹์ด๋Š” ์ง€๊ธˆ ๋ฏธ๋กœ ์†์— ์žˆ๋‹ค. ๋ฏธ๋กœ๋Š” ์ง์‚ฌ๊ฐํ˜• ๋ชจ์–‘์ด๊ณ , ์—ฌํ–‰๊ธธ์„ ๋– ๋‚˜๊ธฐ ์œ„ํ•ด ๋ฏธ๋กœ๋ฅผ ํƒˆ์ถœํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋ฏธ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜์–ด์ ธ์žˆ๋‹ค.

๋นˆ ์นธ: ์–ธ์ œ๋‚˜ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. (โ€˜.โ€™) ๋ฒฝ: ์ ˆ๋Œ€ ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค. (โ€˜#โ€™) ์—ด์‡ : ์–ธ์ œ๋‚˜ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ณณ์— ์ฒ˜์Œ ๋“ค์–ด๊ฐ€๋ฉดย ์—ด์‡ ๋ฅผ ์ง‘๋Š”๋‹ค. (โ€˜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์— ๋„ฃ์—ˆ๋‹ค.

  1. ๊ฐ€๋กœ์„ธ๋กœ ๊ธธ์ด์™€ ๊ฒฉ์ž๋ฅผ input์œผ๋กœ ๋ฐ›์•„ ์ €์žฅํ•œ๋‹ค.
  2. find_begin ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด 0์˜ ์ขŒํ‘œ๋ฅผ ์ฐพ์•„ ์ €์žฅํ•œ๋‹ค.
  3. 2์ฐจ์› ๋ฐฐ์—ด visit์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. ๋น„ํŠธ๋งˆ์Šคํ‚น ์ฒ˜๋ฆฌํ•œ key๋ฅผ ๊ฐ set์— ์ถ”๊ฐ€ํ•˜๋Š”๋ฐ, ์ด๋•Œ ๊ฐ™์€ key๋ฅผ ๋“ค๊ณ  ์žฌ๋ฐฉ๋ฌธํ•œ๋‹ค๋ฉด ์ดํ›„ ์ด๋™์„ ์•ˆํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ visit์„ ํ™œ์šฉํ•˜์˜€๋‹ค.
  4. BFS๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค. deque์— ๋“ค์–ด๊ฐ€๋Š” ๊ฐ ์š”์†Œ๋Š” ์ขŒํ‘œ(i, j), ๋น„ํŠธ๋งˆ์Šคํ‚นํ•œ ์—ด์‡ ๋“ค(keys)๊ณผ ๋ฐฉ๋ฌธํ–ˆ๋˜ ๊ณณ(visits), ๊ทธ๋ฆฌ๊ณ  ์ด๋™ ํšŸ์ˆ˜(moves)๋ฅผ ์ €์žฅํ•œ๋‹ค.
  5. visit 2์ฐจ์› ๋ฐฐ์—ด์˜ ํ˜„์žฌ ์ขŒํ‘œ์— ํ˜„์žฌ keys๋ฅผ ๋“ค๊ณ  ๋ฐฉ๋ฌธํ•œ ์ ์ด ์žˆ์œผ๋ฉด ๋„˜์–ด๊ฐ€๊ณ , ์•„๋‹ˆ๋ผ๋ฉด keys๋ฅผ ๋“ฑ๋กํ•œ๋‹ค. ์ด๋ฅผ check_visits ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ–ˆ๋‹ค.
  6. ํ˜„ ์ขŒํ‘œ์—์„œ ์‚ฌ๋ฐฉ์„ ํ™•์ธํ•˜์˜€๋Š”๋ฐ, ๋งŒ์•ฝ ํ™•์ธํ•˜๋Š” ์ขŒํ‘œ(si, sj)์˜ ๊ฐ’์ด 1์ด๋ผ๋ฉด ํƒˆ์ถœ์ด๋ฏ€๋กœ ํ˜„์žฌ๊นŒ์ง€์˜ ์ด๋™ ํšŸ์ˆ˜(moves)์— 1์„ ๋”ํ•ด returnํ–ˆ๋‹ค. #์€ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋„˜์–ด๊ฐ”๊ณ , ๋งŒ์•ฝ 0์ด๋‚˜ .๋ผ๋ฉด ๊ทธ๋ƒฅ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค. ๋ง‰ํžˆ๊ฑฐ๋‚˜ ํ™•์ธํ•  ๊ฒƒ์ด ์—†๋Š” ์ง€์—ญ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  7. ์ด์™ธ์˜ ๊ฒฝ์šฐ์—๋Š” ์•ŒํŒŒ๋ฒณ, ์ฆ‰ ์—ด์‡ ๋‚˜ ๋ฌธ์ด๋ฏ€๋กœ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ด ๋ถ„๊ธฐ์ฒ˜๋ฆฌํ–ˆ๋‹ค. ๋งŒ์•ฝ ๋Œ€๋ฌธ์ž๋ฅผ ๋งˆ์ฃผํ•œ๋‹ค๋ฉด, ํ˜„์žฌ ํ•ด๋‹นํ•˜๋Š” ๋Œ€๋ฌธ์ž์˜ ์†Œ๋ฌธ์ž๊ฐ€ ํ‚ค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€๋ฅผ ์ฒดํฌํ–ˆ๋‹ค. ์ด๋ฅผ check_has_key ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ–ˆ์œผ๋ฉฐ, keys ์ž์ฒด๊ฐ€ ๋น„ํŠธ๋งˆ์Šคํ‚น ์ฒ˜๋ฆฌ๋˜์–ด์žˆ์œผ๋ฏ€๋กœ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋น„ํŠธ ๋ฐฉ์‹์œผ๋กœ ํ™•์ธํ–ˆ๋‹ค. key๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ deque์— ๋‹ค์Œ ์ด๋™์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋˜์—ˆ๋‹ค.
  8. ๋งŒ์•ฝ ์†Œ๋ฌธ์ž๋ฅผ ๋งˆ์ฃผํ•œ๋‹ค๋ฉด, ํ˜„์žฌ keys์— ํ•ด๋‹น ์•ŒํŒŒ๋ฒณ์˜ key๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค. ์ด๋ฅผ register_key๋กœ ๊ตฌํ˜„ํ–ˆ์œผ๋ฉฐ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋น„ํŠธ ๋ฐฉ์‹์œผ๋กœ ์ถ”๊ฐ€ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ์ด๋™์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋˜์—ˆ๋‹ค.


๊ฒฐ๊ณผ

๋งž์•˜์Šต๋‹ˆ๋‹ค!!

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ