본문 바로가기

알고리즘/Baekjoon

[BOJ] 1189 컴백홈 Python

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

컴백홈

한국어   
시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 128 MB 3734 2072 1647 55.047%

문제

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

      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인 가짓수를 출력한다.

예제 입력 1 복사

3 4 6
....
.T..
....

예제 출력 1 복사

4

풀이 코드 (정답 참고)

import sys
input = sys.stdin.readline

r, c, K = map(int, input().split())
graph = []
graph = [list(input().rstrip()) for _ in range(r)]
answer = 0

dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
def dfs(x, y, k):
    global answer
    if x == 0 and y == (c-1) and k == K:
        answer += 1
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if 0<=nx<r and 0<=ny<c and graph[nx][ny]!='T':
            graph[nx][ny] = 'T' # 방문처리
            dfs(nx, ny, k+1)
            graph[nx][ny] = '.' # 방문해제

graph[r-1][0] = 'T'
dfs(r-1, 0, 1) # 시작지점부터 카운팅
print(answer)

 

오랜만에 문제를 풀려니 잘 안 풀린다.

이 문제의 포인트는 '한 번 지나간 곳은 다시 가지 않는다' 라고 했기 때문에 방문 처리를 T로 해주면 된다.

그리고 처음 그래프를 입력 받을 때 좀 헤멨다

 

문자를 공백 없이 입력받을 때 잊지 말기 !

graph = [list(input().rstrip()) for _ in range(r)]

 

'알고리즘 > Baekjoon' 카테고리의 다른 글

[BOJ] 27210 신을 모시는 사당 Python  (0) 2023.03.23
[BOJ] 16918 붐버맨 Python  (0) 2023.03.22
[BOJ] 10655 마라톤 1 Python  (0) 2023.02.18
[BOJ] 16967 배열 복원하기 Python  (0) 2023.02.18
[BOJ] 2178 미로탐색 Python  (0) 2023.02.18