๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“Š Algorithm/BOJ

โœ… BOJ 1987 - DFS, Backtracking, Bitmasking

by huis_log 2025. 7. 4.

BOJ 1987 ์•ŒํŒŒ๋ฒณ

๋ฌธ์ œ ํ•ต์‹ฌ์€ ๊ฐ™์€ ์•ŒํŒŒ๋ฒณ ๋‘ ๋ฒˆ ๋ชป ๋ฐŸ์Œ. ์‹œ์ž‘ ์นธ ํฌํ•จํ•ด์„œ ์ตœ๋Œ€ ๋ช‡ ์นธ๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋ƒ ๋ฌผ์–ด๋ด„

์ ‘๊ทผ

DFS+๋ฐฑํŠธ๋ž˜ํ‚น. ์ขŒํ‘œ ๋ฐฉ๋ฌธ ๋ง๊ณ  ์•ŒํŒŒ๋ฒณ ์ค‘๋ณต๋งŒ ๋ง‰์œผ๋ฉด ๋จ. ๋น„ํŠธ๋งˆ์Šคํฌ๋กœ ์ฒ˜๋ฆฌ. A~Z๋‹ˆ๊นŒ 26๋น„ํŠธ๋ฉด ๋จ

๋น„ํŠธ๋งˆ์Šคํฌ

visited | (1 << idx)๋กœ ๋ฐฉ๋ฌธ ํ‘œ์‹œ, visited & (1 << idx)๋กœ ์ด๋ฏธ ๊ฐ”๋Š”์ง€ ํ™•์ธ. ๋ฆฌ์ŠคํŠธ๋ณด๋‹ค ๋น ๋ฆ„

DFS ํ๋ฆ„

์ง€๊ธˆ ์นธ์—์„œ ์ƒํ•˜์ขŒ์šฐ ๋Œ๋ ค์„œ ์•ˆ ๊ฐ”์œผ๋ฉด depth+1 ํ•ด์„œ ์žฌ๊ท€. visited๋Š” ์ƒˆ๋กœ ๋„˜๊ธฐ๋‹ˆ๊นŒ ์›๋ณต ํ•„์š” ์—†์Œ

์‹œ์ž‘

(0,0) ์นธ ์•ŒํŒŒ๋ฒณ์œผ๋กœ ์‹œ์ž‘, depth=1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฉด ๋จ

๋

 

#dfs,bitmasking,backtracking
import sys
input=sys.stdin.readline

def dfs(y,x,visited,depth):
    directions=[(1,0),(0,-1),(-1,0),(0,1)]
    global answer
    answer=max(answer,depth)
    
    for dy,dx in directions:
        ny=y+dy
        nx=x+dx
        #๋ฐฉ๋ฌธ ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„์— ์†ํ•˜๊ณ 
        if 0<=ny<r and 0<=nx<c:
            idx=ord(grid[ny][nx])-ord('A')
            #๋ฐฉ๋ฌธํ–ˆ๋˜ ์•ŒํŒŒ๋ฒณ์ธ ๊ฒฝ์šฐ(์ „์ง„๋ถˆ๊ฐ€)
            if visited & (1<<idx):
                continue
            #๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋˜ ์•ŒํŒŒ๋ฒณ์ธ ๊ฒฝ์šฐ(์ „์ง„๊ฐ€๋Šฅ)
            dfs(ny,nx,visited|1<<idx,depth+1)

r,c=map(int,input().split())
grid=[]
for _ in range(r):
    grid.append(list(input().strip()))

visited=0
start_bit=ord(grid[0][0])-ord('A')
visited=(1<<start_bit)
        
answer=1
dfs(0,0,visited,1)
print(answer)

 

๋ฐ˜์‘ํ˜•