Skip to content

Commit 2923d8c

Browse files
committed
[Gold II] Title: 빵집, Time: 448 ms, Memory: 158080 KB -BaekjoonHub
1 parent abe0c79 commit 2923d8c

2 files changed

Lines changed: 89 additions & 0 deletions

File tree

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# [Gold II] 빵집 - 3109
2+
3+
[문제 링크](https://www.acmicpc.net/problem/3109)
4+
5+
### 성능 요약
6+
7+
메모리: 158080 KB, 시간: 448 ms
8+
9+
### 분류
10+
11+
그래프 이론, 그리디 알고리즘, 그래프 탐색, 깊이 우선 탐색
12+
13+
### 제출 일자
14+
15+
2025년 12월 15일 18:10:47
16+
17+
### 문제 설명
18+
19+
<p>유명한 제빵사 김원웅은 빵집을 운영하고 있다. 원웅이의 빵집은 글로벌 재정 위기를 피해가지 못했고, 결국 심각한 재정 위기에 빠졌다.</p>
20+
21+
<p>원웅이는 지출을 줄이고자 여기저기 지출을 살펴보던 중에, 가스비가 제일 크다는 것을 알게되었다. 따라서 원웅이는 근처 빵집의 가스관에 몰래 파이프를 설치해 훔쳐서 사용하기로 했다.</p>
22+
23+
<p>빵집이 있는 곳은 R*C 격자로 표현할 수 있다. 첫째 열은 근처 빵집의 가스관이고, 마지막 열은 원웅이의 빵집이다.</p>
24+
25+
<p>원웅이는 가스관과 빵집을 연결하는 파이프를 설치하려고 한다. 빵집과 가스관 사이에는 건물이 있을 수도 있다. 건물이 있는 경우에는 파이프를 놓을 수 없다.</p>
26+
27+
<p>가스관과 빵집을 연결하는 모든 파이프라인은 첫째 열에서 시작해야 하고, 마지막 열에서 끝나야 한다. 각 칸은 오른쪽, 오른쪽 위 대각선, 오른쪽 아래 대각선으로 연결할 수 있고, 각 칸의 중심끼리 연결하는 것이다.</p>
28+
29+
<p>원웅이는 가스를 되도록 많이 훔치려고 한다. 따라서, 가스관과 빵집을 연결하는 파이프라인을 여러 개 설치할 것이다. 이 경로는 겹칠 수 없고, 서로 접할 수도 없다. 즉, 각 칸을 지나는 파이프는 하나이어야 한다.</p>
30+
31+
<p>원웅이 빵집의 모습이 주어졌을 때, 원웅이가 설치할 수 있는 가스관과 빵집을 연결하는 파이프라인의 최대 개수를 구하는 프로그램을 작성하시오.</p>
32+
33+
### 입력
34+
35+
<p>첫째 줄에 R과 C가 주어진다. (1 ≤ R ≤ 10,000, 5 ≤ C ≤ 500)</p>
36+
37+
<p>다음 R개 줄에는 빵집 근처의 모습이 주어진다. '.'는 빈 칸이고, 'x'는 건물이다. 처음과 마지막 열은 항상 비어있다.</p>
38+
39+
### 출력
40+
41+
<p>첫째 줄에 원웅이가 놓을 수 있는 파이프라인의 최대 개수를 출력한다.</p>
42+
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import Foundation
2+
3+
let input = readLine()!.split(separator: " ").map { Int($0)! }
4+
let R = input[0]
5+
let C = input[1]
6+
7+
var map = Array(repeating: Array(repeating: Character("."), count: C), count: R)
8+
9+
for i in 0..<R {
10+
map[i] = Array(readLine()!)
11+
}
12+
13+
let dr = [-1, 0, 1]
14+
let dc = [1, 1, 1]
15+
16+
var answer = 0
17+
18+
func dfs(_ r: Int, _ c: Int) -> Bool {
19+
if c == C - 1 {
20+
return true
21+
}
22+
23+
for i in 0..<3 {
24+
let nr = r + dr[i]
25+
let nc = c + dc[i]
26+
27+
if nr < 0 || nr >= R || nc >= C { continue }
28+
if map[nr][nc] != "." { continue }
29+
30+
map[nr][nc] = "x"
31+
if dfs(nr, nc) {
32+
return true
33+
}
34+
}
35+
return false
36+
}
37+
38+
for r in 0..<R {
39+
if map[r][0] == "." {
40+
map[r][0] = "x"
41+
if dfs(r, 0) {
42+
answer += 1
43+
}
44+
}
45+
}
46+
47+
print(answer)

0 commit comments

Comments
 (0)