Algorithm

[๋ฐฑ์ค€] 1987. ๋น™๊ณ  python

๐Ÿณ ๋งํฌ

๋ฐฑ์ค€ 1987๋ฒˆ ๋น™๊ณ 

๐Ÿ• ๋ฌธ์ œ

์„ธ๋กœ R์นธ, ๊ฐ€๋กœ C์นธ์œผ๋กœ ๋œ ํ‘œ ๋ชจ์–‘์˜ ๋ณด๋“œ๊ฐ€ ์žˆ๋‹ค. ๋ณด๋“œ์˜ ๊ฐ ์นธ์—๋Š” ๋Œ€๋ฌธ์ž ์•ŒํŒŒ๋ฒณ์ด ํ•˜๋‚˜์”ฉ ์ ํ˜€ ์žˆ๊ณ , ์ขŒ์ธก ์ƒ๋‹จ ์นธ (1ํ–‰ 1์—ด) ์—๋Š” ๋ง์ด ๋†“์—ฌ ์žˆ๋‹ค.

๋ง์€ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ๋„ค ์นธ ์ค‘์˜ ํ•œ ์นธ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ƒˆ๋กœ ์ด๋™ํ•œ ์นธ์— ์ ํ˜€ ์žˆ๋Š” ์•ŒํŒŒ๋ฒณ์€ ์ง€๊ธˆ๊นŒ์ง€ ์ง€๋‚˜์˜จ ๋ชจ๋“  ์นธ์— ์ ํ˜€ ์žˆ๋Š” ์•ŒํŒŒ๋ฒณ๊ณผ๋Š” ๋‹ฌ๋ผ์•ผ ํ•œ๋‹ค. ์ฆ‰, ๊ฐ™์€ ์•ŒํŒŒ๋ฒณ์ด ์ ํžŒ ์นธ์„ ๋‘ ๋ฒˆ ์ง€๋‚  ์ˆ˜ ์—†๋‹ค.

์ขŒ์ธก ์ƒ๋‹จ์—์„œ ์‹œ์ž‘ํ•ด์„œ, ๋ง์ด ์ตœ๋Œ€ํ•œ ๋ช‡ ์นธ์„ ์ง€๋‚  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋ง์ด ์ง€๋‚˜๋Š” ์นธ์€ ์ขŒ์ธก ์ƒ๋‹จ์˜ ์นธ๋„ ํฌํ•จ๋œ๋‹ค.

๐Ÿพ ํ’€์ด ๋ฐฉ๋ฒ•

DFS๋กœ ํ’€์—ˆ์„ ๋• ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๋‹ค.. ๊ทธ๋ฆฌ๊ณ  PASSING ์„ ์ฒ˜์Œ์—๋Š” DICTIONARY๋กœ ๋งŒ๋“ค์–ด {65:0,66:1,..} ์ด๋Ÿฐ ์‹์œผ๋กœ ์•„์Šคํ‚ค ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ˜„ํ•œ ๋’ค, PASSING[ord('A')] == 0 #์ง€๋‚˜์ง€ ์•Š์•˜์Œ. ์ด๋Ÿฐ ์‹์œผ๋กœ ํ•˜๋ฉด ํ’€๋ฆฌ์ง€ ์•Š์•˜๋‹ค. ์•„๋งˆ๋„ ๋‹ค์‹œ ๋ฐฑํŠธ๋ž˜ํ‚นํ•ด๊ฐ€๋Š” ๊ณผ์ •์—์„œ ๊ณ„์† ์ง€๋‚ฌ๋‹ค๊ณ  ํ‘œ์‹œ๋˜์–ด์žˆ์–ด์„œ ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™๋‹ค.

BFS๋กœ ํ’€์ž๋ฉด, ์ง€๋‚˜๊ฐ„ ์•ŒํŒŒ๋ฒณ์ธ์ง€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ง€๋‚˜๊ฐˆ ๋•Œ๋งˆ๋‹ค ์ด์ „ ๊ฑฐ์— ์ง€๋‚˜๊ฐ„ ์•ŒํŒŒ๋ฒณ์„ ๋”ํ•ด์ค€๋‹ค. ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด ์›๋ž˜๋Š” 'A' ์˜€๋‹ค๋ฉด, ๋‹ค์Œ๋ฒˆ์— 'B'๋ฅผ ์ง€๋‚  ๋•Œ ๋ณ€์ˆ˜ ans๋Š” 'A' ์—์„œ 'AB' ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

solution ์ฝ”๋“œ (BFS: ํ†ต๊ณผ, DFS: ์‹œ๊ฐ„์ดˆ๊ณผ)

import sys
sys.stdin = open("input.txt", "rt")
sys.setrecursionlimit(10**5)

dx = [1,-1,0,0]
dy = [0,0,1,-1]

def bfs(x,y):
    global answer
    q = set([(x,y,board[x][y])])

    while q:
        x, y, ans = q.pop()

        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 <= nx < R and 0 <= ny < C and (board[nx][ny] not in ans):
                q.add((nx,ny,ans+board[nx][ny]))
                answer = max(answer, len(ans)+1)



def dfs(x,y,cnt):
    global passing, answer

    answer = max(cnt, answer)
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if 0 <= nx < R and 0 <= ny < C and (board[nx][ny] not in passing):
            passing.append(board[nx][ny])
            dfs(nx, ny, cnt + 1)
            passing.remove(board[nx][ny])



R, C = map(int, sys.stdin.readline().split())
board = list()
for _ in range(R):
    board.append(list(sys.stdin.readline().split().pop()))
passing = list()
passing.append(board[0][0])
answer = 1
# dfs(0,0,1)
bfs(0,0)
print(answer)