๋ฌธ์ : ๋ฐฑ์ค 17836๋ฒ _ ๊ณต์ฃผ๋์ ๊ตฌํด๋ผ!
https://www.acmicpc.net/problem/17836
์๊ฐ ์ ํ | ๋ฉ๋ชจ๋ฆฌ ์ ํ | ์ ์ถ | ์ ๋ต | ๋ง์ ์ฌ๋ | ์ ๋ต ๋น์จ |
---|---|---|---|---|---|
1 ์ด | 256 MB | 2465 | 566 | 431 | 21.923% |
๋ฌธ์
์ฉ์ฌ๋ ๋ง์์ด ์จ๊ฒจ๋์ ๊ณต์ฃผ๋์ ๊ตฌํ๊ธฐ ์ํด (N, M) ํฌ๊ธฐ์ ์ฑ ์ ๊ตฌ (1,1)์ผ๋ก ๋ค์ด์๋ค. ๋ง์์ ์ฉ์ฌ๊ฐ ๊ณต์ฃผ๋ฅผ ์ฐพ์ง ๋ชปํ๋๋ก ์ฑ์ ์ฌ๋ฌ ๊ตฐ๋ฐ ๋ง๋ฒ ๋ฒฝ์ ์ธ์๋์๋ค. ์ฉ์ฌ๋ ํ์ฌ์ ๊ฐ์ง๊ณ ์๋ ๋ฌด๊ธฐ๋ก๋ ๋ง๋ฒ ๋ฒฝ์ ํต๊ณผํ ์ ์์ผ๋ฉฐ, ๋ง๋ฒ ๋ฒฝ์ ํผํด (N, M) ์์น์ ์๋ ๊ณต์ฃผ๋์ ๊ตฌ์ถํด์ผ๋ง ํ๋ค.
๋ง์์ ์ฉ์ฌ๋ฅผ ๊ดด๋กญํ๊ธฐ ์ํด ๊ณต์ฃผ์๊ฒ ์ ์ฃผ๋ฅผ ๊ฑธ์๋ค. ์ ์ฃผ์ ๊ฑธ๋ฆฐ ๊ณต์ฃผ๋ T์๊ฐ ์ด๋ด๋ก ์ฉ์ฌ๋ฅผ ๋ง๋์ง ๋ชปํ๋ค๋ฉด ์์ํ ๋๋ก ๋ณํ๊ฒ ๋๋ค. ๊ณต์ฃผ๋์ ๊ตฌ์ถํ๊ณ ํ๋ฌํฌ์ฆ ํ๊ณ ์ถ์ ์ฉ์ฌ๋ ๋ฐ๋์ T์๊ฐ ๋ด์ ๊ณต์ฃผ๋์ด ์๋ ๊ณณ์ ๋๋ฌํด์ผ ํ๋ค. ์ฉ์ฌ๋ ํ ์นธ์ ์ด๋ํ๋ ๋ฐ ํ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค. ๊ณต์ฃผ๋์ด ์๋ ๊ณณ์ ์ ํํ T์๊ฐ๋ง์ ๋๋ฌํ ๊ฒฝ์ฐ์๋ ๊ตฌ์ถํ ์ ์๋ค. ์ฉ์ฌ๋ ์ํ์ข์ฐ๋ก ์ด๋ํ ์ ์๋ค.
์ฑ์๋ ์ด์ ์ฉ์ฌ๊ฐ ์ฌ์ฉํ๋ ์ ์ค์ ๋ช ๊ฒ "๊ทธ๋"์ด ์จ๊ฒจ์ ธ ์๋ค. ์ฉ์ฌ๊ฐ ๊ทธ๋์ ๊ตฌํ๋ฉด ๋ง๋ฒ์ ๋ฒฝ์ด ์๋ ์นธ์ผ์ง๋ผ๋, ๋จ์จ์ ๋ฒฝ์ ๋ถ์๊ณ ๊ทธ ๊ณต๊ฐ์ผ๋ก ๊ฐ ์ ์๋ค. "๊ทธ๋"์ ์ฑ์ ์ด๋๊ฐ์ ๋ฐ๋์ ํ ๊ฐ ์กด์ฌํ๊ณ , ์ฉ์ฌ๋ ๊ทธ๋์ด ์๋ ๊ณณ์ ๋์ฐฉํ๋ฉด ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค. ๊ทธ๋์ด ๋ถ์ ์ ์๋ ๋ฒฝ์ ๊ฐ์๋ ์ ํ์ด ์๋ค.
์ฐ๋ฆฌ ๋ชจ๋ ์ฉ์ฌ๊ฐ ๊ณต์ฃผ๋์ ์์ ํ๊ฒ ๊ตฌ์ถ ํ ์ ์๋์ง, ์๋ค๋ฉด ์ผ๋ง๋ ๋นจ๋ฆฌ ๊ตฌํ ์ ์๋์ง ์์๋ณด์.
์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์๋ ์ฑ์ ํฌ๊ธฐ์ธ N, M ๊ทธ๋ฆฌ๊ณ ๊ณต์ฃผ์๊ฒ ๊ฑธ๋ฆฐ ์ ์ฃผ์ ์ ํ ์๊ฐ์ธ ์ ์ T๊ฐ ์ฃผ์ด์ง๋ค. ์ฒซ ์ค์ ์ธ ๊ฐ์ ์๋ ๋์ด์ฐ๊ธฐ๋ก ๊ตฌ๋ถ๋๋ค. (3 ≤ N, M ≤ 100, 1 ≤ T ≤ 10000)
๋ ๋ฒ์งธ ์ค๋ถํฐ N+1๋ฒ์งธ ์ค๊น์ง ์ฑ์ ๊ตฌ์กฐ๋ฅผ ๋ํ๋ด๋ M๊ฐ์ ์๊ฐ ๋์ด์ฐ๊ธฐ๋ก ๊ตฌ๋ถ๋์ด ์ฃผ์ด์ง๋ค. 0์ ๋น ๊ณต๊ฐ, 1์ ๋ง๋ฒ์ ๋ฒฝ, 2๋ ๊ทธ๋์ด ๋์ฌ์๋ ๊ณต๊ฐ์ ์๋ฏธํ๋ค. (1,1)๊ณผ (N,M)์ 0์ด๋ค.
์ถ๋ ฅ
์ฉ์ฌ๊ฐ ์ ํ ์๊ฐ T์๊ฐ ์ด๋ด์ ๊ณต์ฃผ์๊ฒ ๋๋ฌํ ์ ์๋ค๋ฉด, ๊ณต์ฃผ์๊ฒ ๋๋ฌํ ์ ์๋ ์ต๋จ ์๊ฐ์ ์ถ๋ ฅํ๋ค.
๋ง์ฝ ์ฉ์ฌ๊ฐ ๊ณต์ฃผ๋ฅผ T์๊ฐ ์ด๋ด์ ๊ตฌ์ถํ ์ ์๋ค๋ฉด, "Fail
"์ ์ถ๋ ฅํ๋ค.
๋์ ๋ต
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define max_num 10001
int n, m, t;
queue<int> x_pop;
queue<int> y_pop;
int x_arr[5] = { 1,0,-1,0};
int y_arr[5] = { 0,1,0,-1};
int rightPlace(int y, int x) {
if (x<0 || y<0 || x>=m || y>=n) {
return 0;
}
return 1;
}
int savePrincess(vector<vector<int>>& array) {
vector<vector<int>> answer(n, vector<int>(m, max_num));
vector<vector<int>> check(n, vector<int>(m));
vector<vector<int>> queue_check(n, vector<int>(m));
int x = 0;
int y = 0;
int distance = 1;
int short_x = -1;
int short_y = -1;
x_pop.push(0); y_pop.push(0); // ์์ ์์น
answer[0][0] = 0;
queue_check[y][x] = 1;
while (!x_pop.empty() && !y_pop.empty()){
int size = x_pop.size();
for (int i = 0; i < size; i++) {
x = x_pop.front(); y = y_pop.front();
queue_check[y][x] = 0;
x_pop.pop(); y_pop.pop();
if (check[y][x]) {
continue;
}
check[y][x] = 1;
for (int i = 0; i < 4; i++) {
x += x_arr[i]; y += y_arr[i];
if (rightPlace(y, x) && array[y][x] != 1 && !check[y][x] && !queue_check[y][x]) { // ๋งต ์์ ์์นํ๋ฉฐ, 1(๋งํ ๊ณณ)์ด ์๋๊ณ , ์ด๋ฏธ ๋ค๋ฅด์ง ์์๊ณ , queue์ ์์ผ๋ฉด
if (array[y][x] == 2) { // ๊ฒ์ ๋๋ฌ
short_x = x;
short_y = y;
}
if (answer[y][x] > distance) { // ํ์ฌ ๊ธฐ๋ก๋ ์๊ฐ๋ณด๋ค ์ ์ ์๊ฐ ๋ด์ ๋์ฐฉํ ์ ์์ผ๋ฉด
answer[y][x] = distance;
}
x_pop.push(x); y_pop.push(y); // queue์ ๋ฃ๊ธฐ
queue_check[y][x] = 1;
}
x -= x_arr[i]; y -= y_arr[i];
}
}
if (check[n - 1][m - 1]) {
break;
}
distance++;
}
if (short_x >= 0) { // ๊ฒ์ ๋ค๋ ์ ๊ฒฝ์ฐ
return min(answer[n - 1][m - 1], answer[short_y][short_x] + abs(m - 1 - short_x) + abs(n - 1 - short_y));
}
else { // ๊ฒ์ ๋๋ฌํ์ง ๋ชปํ์ ๊ฒฝ์ฐ
return answer[n - 1][m - 1];
}
}
int main() {
cin >> n >> m >> t;
vector<vector<int>> arr(n, vector<int>(m));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> arr[i][j];
}
}
int result = savePrincess(arr);
if (result <= t) {
cout <<result << endl;
}
else {
cout << "Fail";
}
}
์ ํ์ ์ธ BFS ๋ฌธ์ ๋ผ ์กฐ๊ฑด๋ง ์ ์ฃผ๋ฉด ์ฝ๊ฒ ํ ์ ์์ ๋ฏ ํ๋ค.
ํ๋ ธ์ต๋๋ค
์ค๊ฐ์ 'ํ๋ ธ์ต๋๋ค' ๊ฐ ๋์์ ์ด์ ๋ฅผ ๋ชฐ๋๋๋ฐ, ์ํ์ข์ฐ ๋ฐฉํฅ์ ๋ฃ๋ ๋ถ๋ถ์์ ์๋ก ๋ค์ ์ฌ๋ผ๊ฐ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํ์ฌ ์์ชฝ ๋ฐฉํฅ์ ๋บ ๊ฒ์ด ๋ฌธ์ ์๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ์๋ ์์ชฝ์ผ๋ก ๊ฐ๋ ๋ฐฉํฅ๋ ๊ณ ๋ คํด์ผํ ๊ฒ์ด ๋น์ฐํ๋ค. (๋๋๋๋)
์ฝ๋ ๋ณด์
๋ค๋ฅธ ์ฌ๋์ ์ฝ๋๋ฅผ ๋ณด๋๊น queue๋ฅผ ๊ตฌํํ ๋, ๋์ฒ๋ผ x, y ์ขํ๋ฅผ ๋ฐ๋ก ๋์ง ์๊ณ ๊ตฌ์กฐ์ฒด๋ฅผ ๊ตฌํํ์ฌ queue<๊ตฌ์กฐ์ฒด>๋ฅผ ๋ง๋ค์๋ค. ์ด๋ ๊ฒ ํ๋ ๊ฒ์ด ๋ ๊ฐ๊ฒฐํ ์ฝ๋๋ฅผ ์งค ์ ์๊ณ ์ข์ ๋ฏ ํ๋ค.
'Algorithm ๋ฌธ์ > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[c++] ๋ฐฑ์ค 18809๋ฒ : Gaaaaaaaaaarden (0) | 2020.03.26 |
---|---|
[c++] ๋ฐฑ์ค 18808๋ฒ : ์คํฐ์ปค ๋ถ์ด๊ธฐ (0) | 2020.03.21 |
[c++]๋ฐฑ์ค 1260๋ฒ : DFS์ BFS (0) | 2020.03.20 |
[python]๋ฐฑ์ค 17836๋ฒ : ๊ณต์ฃผ๋์ ๊ตฌํด๋ผ! (0) | 2020.03.13 |
[python]๋ฐฑ์ค 17827๋ฒ: ๋ฌํฝ์ด ๋ฆฌ์คํธ (0) | 2020.03.13 |
Comment