Skip to content

Commit 673d23a

Browse files
committed
[Gold V] Title: 방탈출, Time: 128 ms, Memory: 2036 KB -BaekjoonHub
1 parent aa91c98 commit 673d23a

2 files changed

Lines changed: 123 additions & 0 deletions

File tree

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# [Gold V] 방탈출 - 23352
2+
3+
[문제 링크](https://www.acmicpc.net/problem/23352)
4+
5+
### 성능 요약
6+
7+
메모리: 2036 KB, 시간: 128 ms
8+
9+
### 분류
10+
11+
그래프 이론, 브루트포스 알고리즘, 그래프 탐색, 너비 우선 탐색
12+
13+
### 제출 일자
14+
15+
2025년 12월 19일 17:43:42
16+
17+
### 문제 설명
18+
19+
<p>여러 방들로 둘러싸인 구역을 탈출해야 한다. 알맞은 비밀번호를 입력하면 탈출할 수 있다.</p>
20+
21+
<p>구역의 지도는 <mjx-container class="MathJax" jax="CHTML" style="font-size: 109%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D441 TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="3"><mjx-c class="mjx-cD7"></mjx-c></mjx-mo><mjx-mi class="mjx-i" space="3"><mjx-c class="mjx-c1D440 TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>N</mi><mo>×</mo><mi>M</mi></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$N \times M$</span></mjx-container> 크기의 격자판으로 나타낼 수 있으며 각 칸은 방을 의미하고 각 칸에는 0부터 9까지의 숫자가 적혀있는데 이는 해당하는 방에 적힌 숫자를 의미한다.</p>
22+
23+
<p>상하좌우 4가지 방향으로만 움직일 수 있으며, 0이 적힌 방은 들어갈 수 없다.</p>
24+
25+
<p>비밀번호의 힌트는 다음과 같다.</p>
26+
27+
<ol>
28+
<li>임의의 방에서 다른 방으로 이동할 때는 항상 두 방 사이의 최단 경로로 이동한다.</li>
29+
<li>1번을 만족하는 경로 중 가장 긴 경로의 시작 방과 끝 방에 적힌 숫자의 합</li>
30+
</ol>
31+
32+
<p>만약 위 2가지 조건을 만족하는 경로가 여러 개라면, 시작 방과 끝 방에 적힌 숫자의 합이 가장 큰 값이 비밀번호가 된다.</p>
33+
34+
<p>시작 방과 끝 방은 동일한 위치일 수도 있다.</p>
35+
36+
<p><예시> <mjx-container class="MathJax" jax="CHTML" style="font-size: 109%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mn class="mjx-n"><mjx-c class="mjx-c35"></mjx-c></mjx-mn><mjx-mo class="mjx-n" space="3"><mjx-c class="mjx-cD7"></mjx-c></mjx-mo><mjx-mn class="mjx-n" space="3"><mjx-c class="mjx-c35"></mjx-c></mjx-mn></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>5</mn><mo>×</mo><mn>5</mn></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$5 \times 5$</span></mjx-container> 형태의 지도가 주어질 때, 위의 2가지 조건을 만족하는 경로는 다음과 같다.</p>
37+
38+
<p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/9b335e35-1fb0-494d-b517-a0480eb097a9/-/preview/" style="width: 480px; height: 300px;"></p>
39+
40+
<p>이 때 비밀번호가 무엇인지를 구해라.</p>
41+
42+
<p>만약 비밀번호를 만들 수 없는 경우 0을 출력한다.</p>
43+
44+
### 입력
45+
46+
<p>첫줄에 지도의 세로 크기 <mjx-container class="MathJax" jax="CHTML" style="font-size: 109%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D441 TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>N</mi></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$N$</span></mjx-container>(<mjx-container class="MathJax" jax="CHTML" style="font-size: 109%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mn class="mjx-n"><mjx-c class="mjx-c31"></mjx-c></mjx-mn><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c2264"></mjx-c></mjx-mo><mjx-mi class="mjx-i" space="4"><mjx-c class="mjx-c1D441 TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c2264"></mjx-c></mjx-mo><mjx-mn class="mjx-n" space="4"><mjx-c class="mjx-c35"></mjx-c><mjx-c class="mjx-c30"></mjx-c></mjx-mn></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn><mo>≤</mo><mi>N</mi><mo>≤</mo><mn>50</mn></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$1 \le N \le 50$</span></mjx-container>), 가로 크기 <mjx-container class="MathJax" jax="CHTML" style="font-size: 109%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D440 TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>M</mi></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$M$</span></mjx-container>(<mjx-container class="MathJax" jax="CHTML" style="font-size: 109%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mn class="mjx-n"><mjx-c class="mjx-c31"></mjx-c></mjx-mn><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c2264"></mjx-c></mjx-mo><mjx-mi class="mjx-i" space="4"><mjx-c class="mjx-c1D440 TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c2264"></mjx-c></mjx-mo><mjx-mn class="mjx-n" space="4"><mjx-c class="mjx-c35"></mjx-c><mjx-c class="mjx-c30"></mjx-c></mjx-mn></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>1</mn><mo>≤</mo><mi>M</mi><mo>≤</mo><mn>50</mn></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$1 \le M \le 50$</span></mjx-container>)이 공백을 두고 주어진다.</p>
47+
48+
<p>둘째 줄부터 <mjx-container class="MathJax" jax="CHTML" style="font-size: 109%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D441 TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>N</mi></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$N$</span></mjx-container>줄에 걸쳐 각 방들의 정보 <mjx-container class="MathJax" jax="CHTML" style="font-size: 109%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mi class="mjx-i"><mjx-c class="mjx-c1D434 TEX-I"></mjx-c></mjx-mi></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>A</mi></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$A$</span></mjx-container>(<mjx-container class="MathJax" jax="CHTML" style="font-size: 109%; position: relative;"><mjx-math class="MJX-TEX" aria-hidden="true"><mjx-mn class="mjx-n"><mjx-c class="mjx-c30"></mjx-c></mjx-mn><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c2264"></mjx-c></mjx-mo><mjx-mi class="mjx-i" space="4"><mjx-c class="mjx-c1D434 TEX-I"></mjx-c></mjx-mi><mjx-mo class="mjx-n" space="4"><mjx-c class="mjx-c2264"></mjx-c></mjx-mo><mjx-mn class="mjx-n" space="4"><mjx-c class="mjx-c39"></mjx-c></mjx-mn></mjx-math><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mn>0</mn><mo>≤</mo><mi>A</mi><mo>≤</mo><mn>9</mn></math></mjx-assistive-mml><span aria-hidden="true" class="no-mathjax mjx-copytext">$0 \le A \le 9$</span></mjx-container>)가 공백을 두고 주어진다.</p>
49+
50+
### 출력
51+
52+
<p>올바른 비밀번호를 출력한다.</p>
53+
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#include<iostream>
2+
#include<queue>
3+
#include<cstring>
4+
using namespace std;
5+
6+
const int N = 50;
7+
int a[N][N];
8+
bool v[N][N];
9+
int n, m;
10+
int dx[] = { 1, -1, 0, 0 };
11+
int dy[] = { 0, 0, 1, -1 };
12+
struct Pos {
13+
int cx, cy, cl;
14+
};
15+
16+
pair<int, int> flood_fill(int sx, int sy) {
17+
queue<Pos> q;
18+
q.push({ sx, sy, 0 });
19+
v[sx][sy] = true;
20+
int len = 0;
21+
int f = a[sx][sy];
22+
int l = a[sx][sy];
23+
24+
while (!q.empty()) {
25+
Pos pos = q.front(); q.pop();
26+
int cx = pos.cx, cy = pos.cy, cl = pos.cl;
27+
if (cl > len) {
28+
len = cl;
29+
l = a[cx][cy];
30+
}
31+
else if (cl == len) l = max(l, a[cx][cy]);
32+
33+
for (int i = 0; i < 4; ++i) {
34+
int nx = cx + dx[i], ny = cy + dy[i];
35+
36+
if (0 <= nx && nx < n && 0 <= ny && ny < m && !v[nx][ny] && a[nx][ny]) {
37+
v[nx][ny] = true;
38+
q.push({ nx, ny, cl + 1 });
39+
}
40+
}
41+
}
42+
return { len, f + l };
43+
}
44+
45+
int main() {
46+
ios::sync_with_stdio(0);
47+
cin.tie(0);
48+
49+
cin >> n >> m;
50+
for (int i = 0; i < n; ++i) {
51+
for (int j = 0; j < m; ++j) {
52+
cin >> a[i][j];
53+
}
54+
}
55+
56+
int mx = 0, ml = 0;
57+
for (int i = 0; i < n; ++i) {
58+
for (int j = 0; j < m; ++j) {
59+
if (!a[i][j]) continue;
60+
memset(v, false, sizeof(v));
61+
auto res = flood_fill(i, j);
62+
if (res.first > ml) {
63+
ml = res.first;
64+
mx = res.second;
65+
}
66+
else if (res.first == ml) mx = max(mx, res.second);
67+
}
68+
}
69+
cout << mx;
70+
}

0 commit comments

Comments
 (0)