πŸ“š Study/Baekjoon

[Gold IV] 1987 - μ•ŒνŒŒλ²³

윰갱 2025. 4. 14. 13:44

문제

μ„Έλ‘œ μΉΈ, κ°€λ‘œ 칸으둜 된 ν‘œ λͺ¨μ–‘μ˜ λ³΄λ“œκ°€ μžˆλ‹€. λ³΄λ“œμ˜ 각 μΉΈμ—λŠ” λŒ€λ¬Έμž μ•ŒνŒŒλ²³μ΄ ν•˜λ‚˜μ”© μ ν˜€ 있고, 쒌츑 상단 μΉΈ (ν–‰ μ—΄) μ—λŠ” 말이 놓여 μžˆλ‹€.

말은 μƒν•˜μ’Œμš°λ‘œ μΈμ ‘ν•œ λ„€ μΉΈ μ€‘μ˜ ν•œ 칸으둜 이동할 수 μžˆλŠ”λ°, μƒˆλ‘œ μ΄λ™ν•œ 칸에 μ ν˜€ μžˆλŠ” μ•ŒνŒŒλ²³μ€ μ§€κΈˆκΉŒμ§€ μ§€λ‚˜μ˜¨ λͺ¨λ“  칸에 μ ν˜€ μžˆλŠ” μ•ŒνŒŒλ²³κ³ΌλŠ” 달라야 ν•œλ‹€. 즉, 같은 μ•ŒνŒŒλ²³μ΄ 적힌 칸을 두 번 μ§€λ‚  수 μ—†λ‹€.

쒌츑 μƒλ‹¨μ—μ„œ μ‹œμž‘ν•΄μ„œ, 말이 μ΅œλŒ€ν•œ λͺ‡ 칸을 μ§€λ‚  수 μžˆλŠ”μ§€λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. 말이 μ§€λ‚˜λŠ” 칸은 쒌츑 μƒλ‹¨μ˜ 칸도 ν¬ν•¨λœλ‹€.

μž…λ ₯

첫째 쀄에 κ³Ό κ°€ λΉˆμΉΈμ„ 사이에 두고 μ£Όμ–΄μ§„λ‹€. () λ‘˜μ§Έ 쀄뢀터 개의 쀄에 κ±Έμ³μ„œ λ³΄λ“œμ— μ ν˜€ μžˆλŠ” 개의 λŒ€λ¬Έμž μ•ŒνŒŒλ²³λ“€μ΄ 빈칸 없이 μ£Όμ–΄μ§„λ‹€.

좜λ ₯

첫째 쀄에 말이 μ§€λ‚  수 μžˆλŠ” μ΅œλŒ€μ˜ μΉΈ 수λ₯Ό 좜λ ₯ν•œλ‹€.

예제 μž…λ ₯ 1 λ³΅μ‚¬

2 4
CAAB
ADCB

예제 좜λ ₯ 1 λ³΅μ‚¬

3

예제 μž…λ ₯ 2 λ³΅μ‚¬

3 6
HFDFFB
AJHGDH
DGAGEH

예제 좜λ ₯ 2 λ³΅μ‚¬

6

예제 μž…λ ₯ 3 λ³΅μ‚¬

5 5
IEFCJ
FHFKC
FFALF
HFGCF
HMCHH

예제 좜λ ₯ 3 λ³΅μ‚¬

10

 


# 풀이 방법

깊이 λ“€μ–΄κ°€λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄κΈ° λ•Œλ¬Έμ— dfs

κ·ΈλŸ¬λ‚˜ μ—¬λŸ¬ 경둜 쀑 깊게 λ“€μ–΄κ°€μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— λ°±νŠΈλž˜ν‚Ή 기법을 μ μš©ν–ˆλ‹€. 이 뢀뢄이 살짝 λ―Έμˆ™ν•¨

μ‹œκ°„μ΄ˆκ³Όκ°€ 계속 λ– μ„œ λ‚œκ°ν–ˆλŠ”λ° pypy λ²„μ „μœΌλ‘œ λŒλ¦¬λ‹ˆκΉŒ ν•΄κ²°λ˜μ—ˆλ‹€.

μ•žμ„  λ¬Έμ œμ—μ„œλ„ κΊ λ‹¬μ•˜μ§€λ§Œ cntλ₯Ό ꡬ해야할 λ•ŒλŠ” 인자λ₯Ό 같이 λ„˜κ²¨μ£ΌλŠ”κ²Œ μ’‹λ‹€


# μ½”λ“œ

# 2025-04-14 13:20-37
import sys
sys.stdin = open("input.txt","r")

r, c = map(int,sys.stdin.readline().split())
graph = [list(sys.stdin.readline().strip()) for _ in range(r)]

visited = set()

# μƒν•˜μ’Œμš°
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

def dfs(x,y,cnt):
    global max_cnt
    visited.add(graph[x][y])
    max_cnt = max(max_cnt, cnt)
    for i in range(4):
        nx, ny = x + dx[i],  y + dy[i]
        if 0 <= nx < r and 0 <= ny < c:
            if graph[nx][ny] not in visited:
                dfs(nx,ny,cnt+1)
    visited.remove(graph[x][y])
    

max_cnt = 0
dfs(0,0,1)
print(max_cnt)