카테고리 없음
[Python]백준 1189번/컴백홈/백트래킹/dfs
유랄라-
2023. 3. 31. 13:43
반응형
https://www.acmicpc.net/problem/1189
1189번: 컴백홈
첫 줄에 정수 R(1 ≤ R ≤ 5), C(1 ≤ C ≤ 5), K(1 ≤ K ≤ R×C)가 공백으로 구분되어 주어진다. 두 번째부터 R+1번째 줄까지는 R×C 맵의 정보를 나타내는 '.'과 'T'로 구성된 길이가 C인 문자열이 주어진다
www.acmicpc.net
⚡️ 문제 설명
R x C 맵에 못가는 부분이 주어지고 거리 K가 주어지면
한수가 집까지도 도착하는 경우 중 거리가 K인 가짓수를 구하는 것
⚡️ 해결 방법
시작점은 (r-1,0)
도착점은 (0,c-1)
시작점 ~ 도착점 까지 거리가 k 인 가짓수를 구하는 문제이다.
백트래킹 문제를 풀어봤다면 쉽게 풀 수 있는 문제였다.
백트래킹은 한정 조건을 가진 문제를 해결하는 전략으로, 탐색을 줄일 수 있다.
DFS는 모든 경우를 탐색하지만, 백트래킹+DFS는 불필요한 탐색을 하지 않는다.
백트래킹은 BFS와 DFS와 모두 구현이 가능하지만, 조건에 부합하지 않으면 이전 노드로 돌아와야하기 때문에 구조적으로 DFS구현이 편하다.
이 문제에서 백트래킹 한정조건은
graph[nx][ny] == '.' 이다.
'.' 일 때 '.'을 'T'로 바꿔 방문처리를 하고 탐색을 시작한다.
탐색이 끝나면 'T'를 '.'로 돌려 놓아 다른방향으로 다시 탐색 하도록 한다.
⚡️ 코드
import sys
input = sys.stdin.readline
# r X c 맵
# 거리가 k 인 가짓수 구하기
r,c,k = map(int, input().split())
graph = []
for _ in range(r):
graph.append(list(input().rstrip()))
dx = [1,-1,0,0]
dy = [0,0,1,-1]
answer = 0
def dfs(x,y,distance):
global answer
# 목표 도착 지점 : (0,c-1)
# 목표 거리 : k
if distance == k and y == c-1 and x==0:
answer += 1
else:
# T로 방문처리
graph[x][y]='T'
for i in range(4):
nx = x+dx[i]
ny = y+dy[i]
# 백트래킹 한정 조건 : graph[nx][ny] == '.'
if(0 <= nx < r and 0 <= ny < c and graph[nx][ny] == '.'):
graph[nx][ny]='T'
dfs(nx,ny,distance+1)
# 원래 상태로 돌려 놓아 다른 방향으로 다시 탐색하도록 한다.
graph[nx][ny]='.'
# 시작점 : (r-1,0)
# 초기 distance : 1
dfs(r-1,0,1)
# 정답
print(answer)
반응형