새소식

PS/백준

[백준/1189] 컴백홈 (Python)

  • -

Problem : 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

 

Difficulty : Silver 1

 

Status : Solved

 

Time : 00:08:01

 


 

문제 설명

 

더보기

한수는 캠프를 마치고 집에 돌아가려 한다. 한수는 현재 왼쪽 아래점에 있고 집은 오른쪽 위에 있다. 그리고 한수는 집에 돌아가는 방법이 다양하다. 단, 한수는 똑똑하여 한번 지나친 곳을 다시 방문하지는 않는다.

 

      cdef  ...f  ..ef  ..gh  cdeh  cdej  ...f 
      bT..  .T.e  .Td.  .Tfe  bTfg  bTfi  .Tde 
      a...  abcd  abc.  abcd  a...  a.gh  abc. 
거리 :  6     6     6     8     8    10    6

 

위 예제는 한수가 집에 돌아갈 수 있는 모든 경우를 나타낸 것이다. T로 표시된 부분은 가지 못하는 부분이다. 문제는 R x C 맵에 못가는 부분이 주어지고 거리 K가 주어지면 한수가 집까지도 도착하는 경우 중 거리가 K인 가짓수를 구하는 것이다.

 

 

입력 및 출력

 

더보기

입력

첫 줄에 정수 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))

'PS > 백준' 카테고리의 다른 글

[백준/2234] 성곽 (Python)  (0) 2023.05.22
[백준/14940] 쉬운 최단거리 (Python)  (0) 2023.05.18
[백준/1904] 01타일 (Python)  (0) 2023.05.14
[백준/11057] 오르막 수 (Python)  (0) 2023.05.11
[백준/1110] 더하기 사이클 (Python)  (0) 2023.05.10
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.