https://www.acmicpc.net/problem/1987
🗒️파이썬 코드 풀이
R,C = map(int,input().split())
lst = []
for i in range(R):
tmp = list(input())
lst.append(tmp)
di,dj = [0,1,0,-1],[1,0,-1,0]
alphabet = [0] * 26
alphabet[ord(lst[0][0])-65] = 1
mx = 0
def dfs(i,j,count):
global mx
mx = max(mx,count)
for k in range(4):
ni,nj = i+di[k],j+dj[k]
if 0<=ni<R and 0<=nj<C:
if not(alphabet[ord(lst[ni][nj])-65]):
alphabet[ord(lst[ni][nj])-65] = 1
dfs(ni,nj,count+1)
alphabet[ord(lst[ni][nj])-65] = 0
dfs(0,0,1)
print(mx)
1. BFS를 먼저 생각해보았지만, 알파벳 체크 부분이 안돼서 DFS로 넘어간다.
2. 방문체크 리스트 대신 alphabet을 이용하여 방문 체크를 한다.
3. 일반적인 dfs 백트래킹과 똑같은데, alphabet 처리가 좀 독특하다.
4. dfs 매개변수로 현재 좌표값과 count 값을 넘겨준다.
📌 문제 코멘트
해당 코드를 python으로 하면 안되고, pypy3로 해야한다.
굳이 ..?! 라는 생각이 든다 ...
뭐 이렇게까지 시간초과를 잡을 필요는 없다고 생각하는데,
방문 표시가 좀 독특해서 블로그 포스팅을 해보았다.
(참고로 방문 표시를 visited와 같이 투머치하게 했어서 메모리 초과도 떴었다...)
📚문제
세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다.
말은 상하좌우로 인접한 네 칸 중의 한 칸으로 이동할 수 있는데, 새로 이동한 칸에 적혀 있는 알파벳은 지금까지 지나온 모든 칸에 적혀 있는 알파벳과는 달라야 한다. 즉, 같은 알파벳이 적힌 칸을 두 번 지날 수 없다.
좌측 상단에서 시작해서, 말이 최대한 몇 칸을 지날 수 있는지를 구하는 프로그램을 작성하시오. 말이 지나는 칸은 좌측 상단의 칸도 포함된다.
입력
첫째 줄에 R과 C가 빈칸을 사이에 두고 주어진다. (1≤R,C≤20) 둘째 줄부터 R개의 줄에 걸쳐서 보드에 적혀 있는 C개의 대문자 알파벳들이 빈칸 없이 주어진다.
출력
첫째 줄에 말이 지날 수 있는 최대의 칸 수를 출력한다.
예제 입력 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
'알고리즘 > 알고리즘_백준' 카테고리의 다른 글
[Python][백준] 1149. RGB거리/ DP (S1) (0) | 2024.08.12 |
---|---|
[Python][백준] 1259. 팰린드롬수 / 구현,문자열 (B1) (0) | 2024.08.11 |
[Python][백준] 2661. 좋은수열 / 백트래킹 (G4) (0) | 2024.08.10 |
[Python][백준] 6603. 로또 / 백트래킹,재귀,조합 (S2) (0) | 2024.08.09 |
[Python][백준] 15650. N과 M (2) / 백트래킹(S2) (0) | 2024.07.27 |