제약 조건이 적어 쉽게 접근할 수 있었다. 사이클을 찾으면 그 사이클과 사이클에 들어올 수 있는 모든 경로는 Safe Zone 하나로 도망 가능하다. 이 원칙 하나로 구현하면 큰 어려움 없이 풀 수 있다.
import sys
input = sys.stdin.readline
R, C = map(int, input().split())
m = [list(input().strip()) for j in range(R)]
v = [[False] * C for _ in range(R)]
safezone = 0
dirs = ((-1, 0), (1, 0), (0, -1), (0, 1))
def search(r, c, q):
global safezone
if m[r][c] == 'U':
d = dirs[0]
elif m[r][c] == 'D':
d = dirs[1]
elif m[r][c] == 'L':
d = dirs[2]
else:
d = dirs[3]
v[r][c] = True
if v[r + d[0]][c + d[1]]:
# 방문기록이 있는데 현재 탐색 중인 큐에 있는 곳이라면 Safe Zone 을 설치해야한다.
if (r + d[0], c + d[1]) in q:
safezone += 1
return
else:
# 방문기록이 있는데 탐색 중인 큐에 없다면 연결될
# 새로운 그룹이 Safe Zone 을 갖고 있으며
# 현재 큐도 기존의 Safe Zone 으로 모두 가게 된다.
q.append((r, c))
search(r + d[0], c + d[1], q)
for i in range(R):
for j in range(C):
if not v[i][j]:
search(i, j, [])
print(safezone)