728x90
문제
https://www.acmicpc.net/problem/1987
1987번: 알파벳
세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으
www.acmicpc.net
풀이
DFS(깊이 우선 탐색), 백트래킹을 사용해 풀었습니다.
check
배열을 사용해 같은 알파벳이 적힌 칸을 두 번 지날 수 없도록 합니다.
ord
함수를 사용해 알파벳을 0~25의 값을 가지도록 합니다.
처음엔 딕셔너리를 사용해 알파벳을 체크해줬다. 그런데 계속 시간초과가 떠서 찾아보니 딕셔너리는 시간복잡도가 최소 O(1)에서 최대 O(n)까지 가능하다고 하여 리스트 인덱싱으로 바꿔주었다.
python을 제출할 때 Python3와 PyPy3 두 가지가 있는데 서로 장단점이 달라 상황에 맞게 사용해야 한다고 한다.
https://ralp0217.tistory.com/entry/Python3-%EC%99%80-PyPy3-%EC%B0%A8%EC%9D%B4
Python3 와 PyPy3 차이
Python3 와 PyPy3 차이 평소에 알고리즘 문제를 풀면서 Python을 지원하는 언어를 선택할 때, Python3와 PyPy3가 대표적으로 있었다. 원래 알던 개념은 PyPy3가 Python3의 실행시 시간이 매우 오래 걸린다는
ralp0217.tistory.com
코드
파이썬
import sys
input = sys.stdin.readline
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
R, C = map(int, input().split())
board = [list(input().rstrip()) for _ in range(R)]
check = [False] * 26
answer = 0
def DFS(x, y, L):
global answer
answer = max(answer, L)
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < R and 0 <= ny < C:
idx = ord(board[nx][ny]) - ord("A")
if not check[idx]:
check[idx] = True
DFS(nx, ny, L + 1)
check[idx] = False
check[ord(board[0][0]) - ord("A")] = True
DFS(0, 0, 1)
print(answer)
728x90
'🚩 코딩테스트 > 알고리즘' 카테고리의 다른 글
[백준] 16236번: 아기 상어 (0) | 2023.05.13 |
---|---|
[백준] 2206번: 벽 부수고 이동하기 (0) | 2023.05.11 |
[백준] 7569번: 토마토 (0) | 2023.05.11 |
[백준] 10026번: 적록색약 (0) | 2023.05.11 |
[백준] 1753번: 최단경로 (0) | 2023.05.11 |