[골드 2] 백준 3109 - 빵집 (파이썬)
글 작성자: pental
https://www.acmicpc.net/problem/3109
풀이
가스관이 있는 빵집의 왼쪽 열에서 시작해 오른쪽 열까지 파이프를 설치할 수 있는 최대 개수를 구하는 것이다.
- '.'은 빈 칸, 'x'는 설치 불가능한 건물
- 파이프는 오른쪽 위 / 오른쪽 / 오른쪽 아래로만 이동 가능
- 파이프는 겹치면 안 됨
- 출발은 각 행의 첫 번째 열 (즉, (i, 0))
def dfs(r, c):
visit[r][c] = True
if c == C - 1: # 오른쪽 끝 도착
return True
DFS는 3방향 우선순위로 탐색을 진행한다.
- 오른쪽 위 (r - 1, c + 1)
- 오른쪽 (r, c + 1)
- 오른쪽 아래 (r + 1, c + 1)
방문한 적 없고 빈 칸이면 DFS 재귀 호출, 도착 성공하면 True 리턴한다.
if r - 1 >= 0 and not visit[r - 1][c + 1] and B[r - 1][c + 1] == '.':
if dfs(r - 1, c + 1):
return True
3방향 다 안 되면 False 리턴한다.
코드
# 백준 2109 - 빵집
# 분류 : DFS
R, C = map(int, input().split())
B = [list(input()) for _ in range(R)]
visit = [[False] * C for _ in range(R)]
def dfs(r, c) :
visit[r][c] = True
# 오른쪽 끝에 도달할 수 있으면 True else False
if c == C - 1 :
return True
if r - 1 >= 0 and not visit[r - 1][c + 1] and B[r - 1][c + 1] == '.' :
if dfs(r - 1, c + 1) :
return True
if not visit[r][c + 1] and B[r][c + 1] == '.' :
if dfs(r, c + 1) :
return True
if r + 1 < R and not visit[r + 1][c + 1] and B[r + 1][c + 1] == '.' :
if dfs(r + 1, c + 1) :
return True
return False
answer = 0
for i in range(R) :
if dfs(i, 0) :
answer += 1
print(answer)
'Programming > 백준' 카테고리의 다른 글
[골드 4] 백준 14395 - 4연산 (파이썬) (0) | 2025.06.29 |
---|---|
[골드 2] 백준 1507 - 궁금한 민호 (파이썬) (0) | 2025.06.28 |
[실버 2] 백준 2790 - F7 (파이썬) (0) | 2025.06.28 |
[골드 3] 백준 25381 - ABBC (파이썬) (1) | 2025.06.27 |
[골드 1] 백준 1113 - 수영장 만들기 (파이썬) (0) | 2025.06.26 |
댓글
이 글 공유하기
다른 글
-
[골드 4] 백준 14395 - 4연산 (파이썬)
[골드 4] 백준 14395 - 4연산 (파이썬)
2025.06.29 -
[골드 2] 백준 1507 - 궁금한 민호 (파이썬)
[골드 2] 백준 1507 - 궁금한 민호 (파이썬)
2025.06.28 -
[실버 2] 백준 2790 - F7 (파이썬)
[실버 2] 백준 2790 - F7 (파이썬)
2025.06.28 -
[골드 3] 백준 25381 - ABBC (파이썬)
[골드 3] 백준 25381 - ABBC (파이썬)
2025.06.27