BFS 또는 DFS를 활용하는 문제입니다. 처음엔 DFS에 지나온 알파벳을 담고있는 list를 매개변수로 넣어 in으로 계속 체킹했는데 시간 초과가 났습니다.
그래서 알파벳 개수의 크기만큼 list를 하나 만들어 체킹하는 방식으로 바꿔 시간을 줄였는데 또 시간 초과가 났습니다. 결국 pypy3로 제출하면 시간 초과가 해결됩니다.
이 문제는 bfs로 푸는 것이 더 효과적이고, 방문 체크 리스트도 R X C형식의 2차원 리스트가 아닌 알파벳 개수만큼의 1차원 리스트를 추천합니다.
import sys
input = sys.stdin.readline
graph = []
answer = 0
r, c = map(int, input().split())
visited = [False] * 26
for _ in range(r):
graph.append(list(map(str, input().rstrip())))
def dfs(x, y, depth):
global r, c, answer
dx = -1, 0, 1, 0
dy = 0, 1, 0, -1
answer = max(answer, depth)
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < r and 0 <= ny < c and not visited[ord(graph[nx][ny]) - 65]:
visited[ord(graph[nx][ny]) - 65] = True
dfs(nx, ny, depth + 1)
visited[ord(graph[nx][ny]) - 65] = False
visited[ord(graph[0][0]) - 65] = True
dfs(0, 0, 1)
print(answer)