첫 줄에 정수 R(1 ≤ R ≤ 5), C(1 ≤ C ≤ 5), K(1 ≤ K ≤ R×C)가 공백으로 구분되어 주어진다. 두 번째부터 R+1번째 줄까지는 R×C 맵의 정보를 나타내는 '.'과 'T'로 구성된 길이가 C인 문자열이 주어진다.
출력
첫 줄에 거리가 K인 가짓수를 출력한다.
입력 예시
3 4 6
....
.T..
....
출력 예시
4
풀이
총 맵의 크기가 5 * 5 = 25이며, 실제로 이동이 인접 좌표만으로 한정되므로 모든 경우의 수를 따져 볼 수 있다. 즉 브루트포스로 접근하는 게 가능하다.
또한, 이런 경로의 가지수를 세는데는 DFS가 제격이다. DFS는 재귀함수를 통해 구현할 경우 visited 배열을 갱신 가능하며, 이 특성을 통해 백트래킹을 쉽게 구현할 수 있다.
이 세 키워드를 가지고 풀이하면 다음과 같은 해답이 나온다!
풀이 코드
R, C, K = map(int, input().split())
dr = [0, 0, -1, 1]
dc = [-1, 1, 0, 0]
visited = [[False]*C for _ in range(R)]
map_list = [input().strip() for _ in range(R)]
def dfs(r, c, k) :
if r == 0 and c == C-1 :
return 1 if k == 0 else 0
if k == 0 :
return 0
result = 0
for i in range(4) :
ar, ac = r + dr[i], c + dc[i]
if -1 < ar < R and -1 < ac < C and map_list[ar][ac] == '.' and not visited[ar][ac] :
visited[ar][ac] = True
result += dfs(ar, ac, k-1)
visited[ar][ac] = False
return result
visited[R-1][0] = True
print(dfs(R-1, 0, K-1))