본문 바로가기

algorithm/백준알고리즘

[백준알고리즘] 3109번: 빵집 -Python

728x90

[백준알고리즘] 3109번: 빵집 -Python

https://www.acmicpc.net/problem/3109

 

3109번: 빵집

문제 유명한 제빵사 김원웅은 빵집을 운영하고 있다. 원웅이의 빵집은 글로벌 재정 위기를 피해가지 못했고, 결국 심각한 재정 위기에 빠졌다. 원웅이는 지출을 줄이고자 여기저기 지출을 살펴보던 중에, 가스비가 제일 크다는 것을 알게되었다. 따라서 원웅이는 근처 빵집의 가스관에 몰래 파이프를 설치해 훔쳐서 사용하기로 했다. 빵집이 있는 곳은 R*C 격자로 표현할 수 있다. 첫째 열은 근처 빵집의 가스관이고, 마지막 열은 원웅이의 빵집이다. 원웅이는 가스관과 빵

www.acmicpc.net

문제에 대한 접근은 어렵지 않은 것 같다. visit 리스트를 만들고 오른쪽 위부터 우선적으로 이동하면서 윗줄부터 가능한 경우를 채워나가면 된다.

 

하지만 처음에 시간 초과가 나왔다. 문제는 하나의 위치에 중복해서 방문하는 것이었다. 항상 solve()의 결과가 False이면 visit[][]의 값을 False로 바꿔주었는데, 그럴 필요가 없었다.

 

한번 해당 지점을 방문해서 원웅이의 빵집에 도달했으면 이미 연결된 경로이기 때문에 파이프를 둘 수 없는 지점이 되며, 해당 지점을 방문한 이후 원웅이의 방집까지 도달하지 못했으면 또다시 해당 지점에 방문했을 때도 마찬가지로 원웅이의 빵집까지 도달할 수 없기 때문이다.

def solve(i, j):
    if j == c-1:
        return True
    
    for d in dx:
        if 0<=i+d<r and table[i+d][j+1] == '.' and not visit[i+d][j+1]:
            visit[i+d][j+1] = True
            if solve(i+d, j+1):
                return True
    return False

r, c = map(int, input().split())
table = [list(input().rstrip()) for _ in range(r)]
visit = [[False] * c for _ in range(r)]
dx = [-1, 0, 1]
ans = 0
for i in range(r):
    if table[i][0] == '.':
        if solve(i, 0):
            ans += 1
print(ans)

 

잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다

728x90