Skip to content

Commit 0ad8674

Browse files
committed
[Gold III] Title: 아기돼지와 늑대, Time: 0 ms, Memory: 2176 KB -BaekjoonHub
1 parent 9457289 commit 0ad8674

2 files changed

Lines changed: 118 additions & 0 deletions

File tree

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# [Gold III] 아기돼지와 늑대 - 16441
2+
3+
[문제 링크](https://www.acmicpc.net/problem/16441)
4+
5+
### 성능 요약
6+
7+
메모리: 2176 KB, 시간: 0 ms
8+
9+
### 분류
10+
11+
그래프 이론, 그래프 탐색, 너비 우선 탐색
12+
13+
### 제출 일자
14+
15+
2026년 2월 15일 13:32:19
16+
17+
### 문제 설명
18+
19+
<p>산으로 둘러싸인 고리분지에 사는 아기돼지 삼형제는 엄마돼지로부터 독립하여 새 집을 지으려 합니다.</p>
20+
21+
<p>고리분지는 <em>N</em> × <em>M</em> 크기의 2차원 격자로 나타낼 수 있고 각 칸의 지형은 초원, 빙판, 산 중 하나입니다.</p>
22+
23+
<p>고리분지에는 돼지가족들 뿐만 아니라 늑대들도 살고 있습니다. 늑대는 상하좌우 인접한 칸 중 산이 아닌 칸으로 이동할 수 있습니다. 만약 이동한 칸이 빙판이라면 초원을 밟거나 산에 부딪칠 때까지 이동한 방향으로 미끄러집니다. 산에 부딪친 경우 늑대는 빙판 위에 가만히 서있을 수 있고 다시 다른 방향으로 이동할 수 있습니다.</p>
24+
25+
<p>게으른 아기돼지들은 지푸라기로 집을 지을 예정이기 때문에 늑대가 집이 있는 칸에 도착하기만 한다면 손쉽게 침입할 수 있습니다. 고리분지에 사는 늑대들이 도달할 수 없고 지형이 초원인 칸을 '안전한 곳'이라고 부릅니다. 게으른 아기돼지들을 위해 고리분지의 지도가 주어지면 지도 위에 모든 안전한 곳의 위치를 표시해주세요.</p>
26+
27+
### 입력
28+
29+
<p>첫 번째 줄에는 격자의 행의 수를 나타내는 <em>N</em> (3 ≤ <em>N</em> ≤ 100) 과 격자의 열의 수를 나타내는 <em>M</em> (3 ≤ <em>M</em> ≤ 100) 이 주어집니다.</p>
30+
31+
<p>두 번째 줄부터 <em>N</em>개의 줄에 지도의 정보를 나타내는 길이가 <em>M</em>인 문자열들이 주어집니다. </p>
32+
33+
<p><em>i</em>+1번째 줄의 <em>j</em>번째 문자는 <em>i</em>번째 행 <em>j</em>번째 열의 지형 종류를 의미하며 '<code>.</code>' 일 경우 초원, '<code>+</code>' 일 경우 빙판, '<code>#</code>' 일 경우 산, 그리고 '<code>W</code>'는 늑대가 살고 있음을 나타냅니다. 늑대가 사는 칸은 여러 개일 수 있고 늑대가 사는 지형은 항상 초원입니다. 지도의 첫 번째, <em>N</em>번째 행과 첫 번째, <em>M</em>번째 열은 항상 산입니다.</p>
34+
35+
### 출력
36+
37+
<p>입력으로 주어진 지도를 출력하되 아기돼지가 살 수 있는 초원은 문자 '<code>P</code>'로 대체하여 출력합니다.</p>
38+
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
#include<iostream>
2+
#include<queue>
3+
using namespace std;
4+
5+
const int N = 100;
6+
int n, m;
7+
char arr[N][N];
8+
bool v[N][N];
9+
int dx[] = { 1, -1, 0, 0 };
10+
int dy[] = { 0, 0, 1, -1 };
11+
struct Pos {
12+
int cx, cy;
13+
};
14+
queue<Pos> wolfs;
15+
16+
void bfs(Pos& wolf) {
17+
queue<Pos> q;
18+
q.push(wolf);
19+
v[wolf.cx][wolf.cy] = true;
20+
21+
while (!q.empty()) {
22+
auto [cx, cy] = q.front(); q.pop();
23+
24+
for (int i = 0; i < 4; ++i) {
25+
int nx = cx + dx[i], ny = cy + dy[i];
26+
27+
if (arr[nx][ny] == '.' && !v[nx][ny]) {
28+
v[nx][ny] = true;
29+
q.push({ nx, ny });
30+
}
31+
32+
while (arr[nx][ny] == '+') {
33+
nx += dx[i];
34+
ny += dy[i];
35+
}
36+
37+
if (arr[nx][ny] == '.') {
38+
if (v[nx][ny]) continue;
39+
v[nx][ny] = true;
40+
q.push({ nx, ny });
41+
}
42+
43+
if (arr[nx][ny] == '#') {
44+
nx -= dx[i];
45+
ny -= dy[i];
46+
47+
if (v[nx][ny]) continue;
48+
v[nx][ny] = true;
49+
q.push({ nx, ny });
50+
}
51+
}
52+
}
53+
}
54+
55+
int main() {
56+
ios::sync_with_stdio(0);
57+
cin.tie(0);
58+
cout.tie(0);
59+
60+
cin >> n >> m;
61+
for (int i = 0; i < n; ++i) {
62+
for (int j = 0; j < m; ++j) {
63+
cin >> arr[i][j];
64+
if (arr[i][j] == 'W') wolfs.push({i, j});
65+
}
66+
}
67+
68+
while (!wolfs.empty()) {
69+
Pos wolf = wolfs.front(); wolfs.pop();
70+
bfs(wolf);
71+
}
72+
73+
for (int i = 0; i < n; ++i) {
74+
for (int j = 0; j < m; ++j) {
75+
if (arr[i][j] == '.' && !v[i][j]) cout << 'P';
76+
else cout << arr[i][j];
77+
}
78+
cout << "\n";
79+
}
80+
}

0 commit comments

Comments
 (0)