백준

[백준 1987] 알파벳 (python)

케굴 2023. 4. 5. 18:54

 

풀이

BFS로 풀게 되면 알파벳을 한번씩 방문하는 조건을 체크할 수 없다. 

따라서 하나씩 가능성을 탐색하는 DFS로 풀어야 한다.  

 

재귀를 이용하여 DFS를 구현하였다. 

 

이미 방문한 적 있는 알파벳을 list에 append하여 저장하고 

in 연산자를 사용하여 방문한적 있는지를 확인했더니 시간 초과가 났다.

 

그래서 알파벳을 길이가 26인 배열로 표현하여 포함 여부를 체크했더니 성공할 수 있었다. 

 

 python에서는 문자를 아스키 코드에 해당하는 정수로 변환하기 위해 아래와 같이 ord 라는 연산자를 사용한다. 

ord('A') 

ord(board[new_x][new_y])

 

# 알파벳 
# 세로: R, 가로: C
# 행 : x , 열 : y 

dx =[1, 0, -1, 0]
dy =[0, 1, 0, -1]
R, C = map(int, input().split(" "))

board = []
alpha = [0] * 26
visited =[[0]*C for _ in range(R) ]

for i in range(R):
  el = list(input())
  board.append(el)

ans =1
def dfs(now, visited, alpha ,cnt):
  global ans 
  visited[now[0]][now[1]] = 1
  alpha[ord(board[now[0]][now[1]]) - 65 ] =1
  for i in range(4):
    new_x = now[0] + dx[i]
    new_y = now[1] + dy[i]
    if 0  <= new_y < C  and 0 <= new_x < R  and visited[new_x][new_y] ==0:
      if alpha[ ord(board[new_x][new_y]) - 65] == 1:
        continue
      if cnt+1 > ans :
        ans = cnt+1
      dfs([new_x, new_y], visited, alpha ,cnt+1)
      visited[new_x][new_y] = 0
      alpha[ ord(board[new_x][new_y]) - 65] =0
  return 
dfs([0,0], visited, alpha ,1)
print(ans)