Notice
Recent Posts
Recent Comments
Link
Tags
- LCs
- C++
- ๊ฐ์ฅ๊ฐ๊น์ด๊ณตํต์กฐ์
- ์์ฝ๋
- ์๊ณ ๋ฆฌ์ฆ
- ์ฌ๊ท
- ์นด์นด์ค ์ฝํ
- BFS
- ๋ฐฑ์๋ ํ๋ฆฌ์จ๋ณด๋ฉ
- ๋ฐฑ์ค
- ๋นํธ๋งต
- ์น๋ฆฐ์ด
- DFS
- ์ฌ๋ผ์ด๋ฉ ์๋์ฐ
- ์นด์นด์ค2021
- ์ํฐ๋
- ๋์ ํ๋ก๊ทธ๋๋ฐ
- nestjs
- ์ด๋ถํ์
- golang
- js
- ํธ๋ฆฌ
- ๋นํธ๋ง์คํน
- Python
- Union-Find
- DP
- go
- ํ๋ก๊ทธ๋๋จธ์ค
- ๋ค์ต์คํธ๋ผ
- ํ๋ฆฌ์จ๋ณด๋ฉ
Archives
- Today
- Total
Hello Ocean! ๐ผ
[๋ฐฑ์ค/C++] 16236.์๊ธฐ์์ด ๋ณธ๋ฌธ
๋ฐ์ํ
๋ฌธ์
ํ์ด
์กฐ๊ฑด์ด ๋งค์ฐ! ๋ง์ ๋ฌธ์ ์๋ค.
BFS๋ฅผ ํตํด์ ํ์ด์ผ ํ๋ค๋๊ฑด ์์์ง๋ง, ๊ณ์ ์ค๋ต์ด ๋์์ ๋ค๋ฅธ ๋ถ๋ค์ ํ์ด๋ฅผ ์ฐธ๊ณ ํ๋ค.
1. ์ฐ์ ์์ ํ ์ฌ์ฉ
- ๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ 1๋ง๋ฆฌ๋ณด๋ค ๋ง๋ค๋ฉด, ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์ผ๋ฌ ๊ฐ๋ค.
- ๊ฑฐ๋ฆฌ๋ ์๊ธฐ ์์ด๊ฐ ์๋ ์นธ์์ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ ์นธ์ผ๋ก ์ด๋ํ ๋, ์ง๋์ผํ๋ ์นธ์ ๊ฐ์์ ์ต์๊ฐ์ด๋ค.
- ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ๊น์ด ๋ฌผ๊ณ ๊ธฐ๊ฐ ๋ง๋ค๋ฉด, ๊ฐ์ฅ ์์ ์๋ ๋ฌผ๊ณ ๊ธฐ, ๊ทธ๋ฌํ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์ฌ๋ฌ๋ง๋ฆฌ๋ผ๋ฉด, ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋๋ค.
--> ์์ ์กฐ๊ฑด์ ์ ์ฉ์ํค๊ธฐ ์ํด์ ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ๋ค.
ํ์ ์ฌ๋ฌ๊ฐ๋ฅผ ๋ฃ์ผ๋ฉด, ์์์ ์ ๋ ฌํด์ ์ ์ผ ๋จผ์ ๋จน์ด์ผํ ๋ฌผ๊ณ ๊ธฐ๋ฅผ top์ ์์น์ํค๋๋ก ํจ.
2. Fish ๊ตฌ์กฐ์ฒด ์ฌ์ฉ
Fish ๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋ค์ด ํ์ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ,
์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ๊ธฐ ์ํด compare ํจ์๋ฅผ ์ ์ํด์ฃผ์๋ค.
์ฝ๋
#include<iostream>
#include <vector>
#include <queue>
using namespace std;
int N;
int table[20][20];
bool visited[20][20] = { 0, };
int baby_size = 2;
int move_count = 0;
int eat_count = 0;
int dc[4] = { -1,0,1,0 };
int dr[4] = { 0,-1,0,1 };
struct Fish {
int dist;
int r;
int c;
//์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ๊ธฐ ์ํด ๋ฐ๊ฟ์ค
bool operator < (const Fish &f) const {
if (dist == f.dist) {
if (r == f.r) {
return c > f.c; // c๊ธฐ์ค ์ค๋ฆ์ฐจ์
}
else return r > f.r; //r ๊ธฐ์ค ์ค๋ฆ์ฐจ์
}
else return dist > f.dist; // ๊ฑฐ๋ฆฌ ๊ธฐ์ค ์ค๋ฆ์ฐจ์
}
};
priority_queue<Fish> q;
void BFS() {
while (!q.empty()) {
int dist = q.top().dist;
int c = q.top().c;
int r = q.top().r;
q.pop();
if (table[r][c] > 0 && table[r][c] < baby_size) {
eat_count++;
table[r][c] = 0;
if (baby_size == eat_count) {
baby_size++;
eat_count = 0;
}
move_count += dist; //์์ด๊ฐ ์ด ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๊ธฐ๊น์ง ์ผ๋ง๋ ์์ง์๋์ง ๋ํด์ค
dist = 0; //์ง๊ธ ์์น๋ถํฐ ๋ค์ ๋ค์ ๋ฌผ๊ณ ๊ธฐ๊น์ง ๊ฑฐ๋ฆฌ ์ฌ์ผํ๋ 0์ผ๋ก ์ด๊ธฐํ
fill(&visited[0][0], &visited[19][20],0); //๋ฐฉ๋ฌธ ์ฒดํฌ ์ด๊ธฐํ
while (!q.empty()) q.pop(); //ํ ๋น์์ค (์ง๊ธ ์๋ฆฌ๋ถํฐ ์๋ก ์ฑ์์ผํจ)
}
for (int i = 0;i < 4;i++) {
int new_r = r + dr[i];
int new_c = c + dc[i];
//๋ฒ์ ๋ฒ์ด๋๋ฉด ํ์ ์ ๋ฃ์
if (new_r < 0 || new_r >= N || new_c < 0 || new_c >= N) continue;
//์ด๋ฏธ ๋ฐฉ๋ฌธํ ๊ณณ์ด๋ฉด ์ ๋ฃ์
if (visited[new_r][new_c]) continue;
// ์๊ธฐ ์์ด ํฌ๊ธฐ๋ณด๋ค ํฐ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์์ผ๋ฉด ์ ๋ฃ์
if (table[new_r][new_c] > baby_size) continue;
q.push({ dist + 1,new_r,new_c });
visited[new_r][new_c] = 1;
}
}
}
int main(void) {
int now_r, now_c;
cin >> N;
for (int i = 0;i < N;i++) {
for (int j = 0;j < N;j++) {
cin >> table[i][j];
if (table[i][j] == 9) {
table[i][j] = 0; //๋น์นธ์ผ๋ก ๋ง๋ค์ด์ฃผ๊ธฐ
q.push({ 0,i,j });
}
}
}
BFS();
cout << move_count << endl;
return 0;
}
๊ฒฐ๊ณผ
๋ฐ์ํ
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค/C++] 1707. ์ด๋ถ๊ทธ๋ํ (0) | 2021.05.12 |
---|---|
[๋ฐฑ์ค/C++] 2206. ๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ (0) | 2021.05.12 |
[๋ฐฑ์ค/C++] 1987. ์ํ๋ฒณ (0) | 2021.05.04 |
[๋ฐฑ์ค/C++] 1238. ํํฐ (0) | 2021.04.28 |
[๋ฐฑ์ค/C++] 1915. ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ (0) | 2021.04.14 |