๋ฌธ์
ํ์ด
์ด ๋ฌธ์ ๋ฅผ ํ ๋ ์ค์ํ ์ ์, ๋ฌผ๊ณ ๊ธฐ๋ฅผ ํ๋ง๋ฆฌ ๋จน์ ๋ ๋ง๋ค ๊ทธ๋ฆฌ๊ณ ๋ฌผ๊ณ ๊ธฐ ํฌ๊ธฐ๊ฐ ๋์์ ๋ ๋ง๋ค ๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ฌํ์ํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
๋ฌผ๊ณ ๊ธฐ๋ฅผ ํ ๋ง๋ฆฌ ๋จน์์ผ๋ฉด, ๊ทธ์๋ฆฌ๋ก ์ด๋ํด์ ๋ค์ ๊ฐ์ฅ ๊ฐ๊น์ด && ๊ฐ์ฅ ์์ ์๋ && ๊ฐ์ฅ ์์ชฝ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋ค์ ์ฐพ์์ผํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฌผ๊ณ ๊ธฐ ํฌ๊ธฐ๊ฐ ๋์๋ค๋ฉด, ๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๊ฐ ๋์ด๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฌผ๊ณ ๊ธฐ๋ฅผ ํ์ํ๋ ๋ถ๋ถ์, ๊ฐ์ฅ ๊ฐ๊น์ด ๋ฌผ๊ณ ๊ธฐ๊ฐ ์ต์ฐ์ ์ด๋ฏ๋ก ์ต๋จ๊ฑฐ๋ฆฌ ์ฐพ๊ธฐ์ ์ฐ์ด๋ BFS ๋ฅผ ์ด์ฉํ๋ค.
- ๋ณ์ ์ค๋ช
1. ํ์ํ ๋๋ง๋ค ์์ด๊ฐ ๊ฐ๊ณ ์์ด์ผํ ๋ณ์(์ขํ, ์ฌ์ด์ฆ, ๋จน์ ๋ฌผ๊ณ ๊ธฐ์, ์๊ฐ)๊ฐ ๋ง์์ ๊ตฌ์กฐ์ฒด๋ก ์์ด๋ณ์๋ฅผ ํํํ๋ค. ๋ฌผ๊ณ ๊ธฐ๋ ์ขํ, ๊ฑฐ๋ฆฌ ๋ณ์๋ฅผ ๊ฐ๊ณ ์์ด์ผ ํด์ ๊ตฌ์กฐ์ฒด๋ก ํํํ๋ค.
typedef struct {
int x;
int y;
int size;
int eating_num;
int time;
}Shark;
typedef struct {
int x;
int y;
int distance;
}Fish;
2. ์ฐพ์ ๋ฌผ๊ณ ๊ธฐ๋ค์ ๋จ์ด์ง ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ ๊ฒฝ์ฐ ๋ฌธ์ ์ ์กฐ๊ฑด๋๋ก ์ ๋ ฌํด์ผํ๋ฏ๋ก ๋ฌผ๊ณ ๊ธฐ๋ค์ ์ ์ฅํด ๋์ ๋ฒกํฐ ๋ณ์๋ฅผ ๋ง๋ค์๋ค.
vector<Fish> fish_vector;
๊ทธ๋ฆฌ๊ณ ์ ๋ ฌ์ sortํจ์๋ฅผ customํด์ ๊ตฌํ๋ค.
//sort(fish_vector.begin(), fish_vector.end(), sortFish);
bool sortFish(Fish fish1, Fish fish2) {
//1. distance๊ฐ ๊ฐ์ฅ ์์ ๊ฒ.
if (fish1.distance < fish2.distance) {
return true;
}
else if (fish1.distance > fish2.distance) {
return false;
}
else {//๊ฐ์ ๋
//2. ๊ฐ์ฅ ์์ ์๋ ๊ฒ. i๊ฐ ๊ฐ์ฅ ์์ ๊ฒ.
if (fish1.x < fish2.x) {
return true;
}
else if (fish1.x > fish2.x) {
return false;
}
else {//๊ฐ์ ๋
//3. ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ ๊ฒ. j๊ฐ ๊ฐ์ฅ ์์ ๊ฒ.
if (fish1.y < fish2.y) {
return true;
}
else if (fish1.y > fish2.y) {
return false;
}
else return false;
}
}
}
- ๋ก์ง์ค๋ช
1. ๋ฌธ์ ์์ ์ฃผ์ด์ง Input์ ๋ฐ๋๋ค. ์ด ๋, ์์ด์ ์์น์์ BFS๋ฅผ ํ์ํด์ผ ํ๋ฏ๋ก ์์ด์ ์์น๊ฐ ๋ค์ด์์ ๋, ์์ด ๊ตฌ์กฐ์ฒด ๋ณ์๋ฅผ ํด๋น ์์น๋ก ์ด๊ธฐํํด์ค๋ค.
2. Input์ ๋ฐ์ ๋, ๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ ์๋ ๊ฐฑ์ ํด์ค์ ๋ฌผ๊ณ ๊ธฐ์๊ฐ 1๊ฐ ์ด์์ด๋ผ๋ฉด BFS๋ก ํ์์ ์งํํ๊ณ , ์๋๊ฒฝ์ฐ 0์ ์ถ๋ ฅํ๋๋ก ํด์คฌ๋ค.
3. ๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ ์๊ฐ ์๋ค๋ฉด, BFS๋ก ๋ฌผ๊ณ ๊ธฐ๋ค์ ์ฐพ๋๋ค.
int direction[4][2] = { {-1,0},{1,0},{0,-1},{0,1} }; //์ํ์ข์ฐ ๋ฐฉํฅํค
queue<pair<pair<int, int>,int>> move_q; //์ด๋ํ ์ ์๋ ์นธ๋ค์ ์ ์ฅํ ๋ณ์(์นธ์ x์ขํ, y์ขํ, ์ด๋ ๊ฑฐ๋ฆฌ)
bool visited[MAX_SIZE][MAX_SIZE]; //๋ฐฉ๋ฌธ์ฌ๋ถ๋ฅผ ์ฒดํฌํ ๋ณ์
3-1 ์ํ์ข์ฐ ๋ฐฉํฅํค๋ก ์ด๋ํ๋ค๊ฐ ํด๋น ์๋ฆฌ๊ฐ 0์ด ์๋๊ณ , ์๊ธฐ๋ณด๋ค ์์ ์๋ฅผ ๋ง๋ฌ์ ๋, ํด๋น ์นธ์ ์ ๋ณด๋ฅผ ๋ฌผ๊ณ ๊ธฐ ๋ณ์๋ฅผ ํ๋ ๋ง๋ค๊ณ ๋ฒกํฐ์ ์ ์ฅํด์ค๋ค. ์ด ๋, ์ด๋๊ฑฐ๋ฆฌ๊ฐ 1์ฉ ๋์ด๋๋๊น dist(๊ฑฐ๋ฆฌ๋ณ์)์ 1 ๋๋ฆฐ ๊ฐ์ ์ ์ฅํด์ค๋ค.
Fish fish = {next_x, next_y, dist+1};
fish_vector.push_back(fish);
4. ํ์์ด ๋ชจ๋ ๋๋ฌ๋ค๋ฉด, ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ ๋ ฌํด์ ๋งจ ์์ ์๋ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์ผ๋ฌ ๊ฐ๋ค.
5. ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์ ๋, ์์ด์ ์ ๋ณด๋ฅผ ๊ฐฑ์ ํด์ค๋ค.
shark.x = fish_vector.front().x;
shark.y = fish_vector.front().y;
shark.eating_num += 1;
shark.time += fish_vector.front().distance;
map[shark.x][shark.y] = 9;
5-1 ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์๋๋ฐ ์์ด๊ฐ ๋จน์ ๋ฌผ๊ณ ๊ธฐ ์์ ์๊ธฐ ๋ชธ ํฌ๊ธฐ๊ฐ ๊ฐ์์ก๋ค๋ฉด, ๋จน์ ๊ฐ์๋ฅผ 0์ผ๋ก ์ด๊ธฐํํด์ฃผ๊ณ ๋ค์ BFS๋ก ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ฐพ์ผ๋ฌ ๊ฐ๋ค.
if (shark.eating_num == shark.size) {
shark.size += 1;
shark.eating_num = 0;
SearchBFS();//๋ฌผ๊ณ ๊ธฐ ํฌ๊ธฐ๊ฐ ๋๋ฉด ๋ฌผ๊ณ ๊ธฐ ๋ค์ ์ฐพ์์ผ ํจ
}
์ ์ฒด ์ฝ๋
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
typedef struct {
int x;
int y;
int size;
int eating_num;
int time;
}Shark;
typedef struct {
int x;
int y;
int distance;
}Fish;
const int MAX_SIZE = 21;
int direction[4][2] = { {-1,0},{1,0},{0,-1},{0,1} };//์ํ์ข์ฐ ๋ฐฉํฅํค
int map_size;
int map[MAX_SIZE][MAX_SIZE];
Shark shark;
vector<Fish> fish_vector;//๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๋ค์ ์ ์ฅํ ๋ฐฐ์ด(์ ๋ ฌ์ ์ํด ๋ฒกํฐ์ ์ ์ฅ)
int SearchBFS();//๋ฌผ๊ณ ๊ธฐ ํ์
void eatFish();//๋ฌผ๊ณ ๊ธฐ ๋จน๊ธฐ
//๋ฌผ๊ณ ๊ธฐ ์ ๋ ฌ
bool sortFish(Fish fish1, Fish fish2) {
//1. distance๊ฐ ๊ฐ์ฅ ์์ ๊ฒ.
if (fish1.distance < fish2.distance) {
return true;
}
else if (fish1.distance > fish2.distance) {
return false;
}
else {//๊ฐ์ ๋
//2. ๊ฐ์ฅ ์์ ์๋ ๊ฒ. i๊ฐ ๊ฐ์ฅ ์์ ๊ฒ.
if (fish1.x < fish2.x) {
return true;
}
else if (fish1.x > fish2.x) {
return false;
}
else {//๊ฐ์ ๋
//3. ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ ๊ฒ. j๊ฐ ๊ฐ์ฅ ์์ ๊ฒ.
if (fish1.y < fish2.y) {
return true;
}
else if (fish1.y > fish2.y) {
return false;
}
else return false;
}
}
}
int main() {
int fish_num = 0;
cin >> map_size;
for (int i = 0; i < map_size; i++) {
for (int j = 0; j < map_size; j++) {
cin >> map[i][j];
if (map[i][j] == 9) {//9๊ฐ ์์ด ์์น. ์์ด์ด๊ธฐํ.
shark.x = i;
shark.y = j;
shark.size = 2;
shark.eating_num = 0;
shark.time = 0;
}
//์์ด๊ฐ ๋จน์ ์ ์๋(์๊ธฐ๋ณด๋ค ์์ ๋ฌผ๊ณ ๊ธฐ) ๋ฌผ๊ณ ๊ธฐ ์ ๊ฐฑ์
if (map[i][j] > 0 && map[i][j] < 2) {
fish_num++;
}
}
}
while (fish_num > 0) {//ํ๋๋ผ๋ ์๋ค๋ฉด ๋จน์ผ๋ฌ ๊ฐ๊ธฐ
fish_num = SearchBFS();
} cout << shark.time;
return 0;
}
//BFS๋ก ๋จน์ ์ ์๋ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ฌผ๊ณ ๊ธฐ ์ฐพ๊ธฐ(์์ ์ ํฌ๊ธฐ๋ณด๋ค ์์ ๋ฌผ๊ณ ๊ธฐ)
int SearchBFS() {
queue<pair<pair<int,int>,int>> move_q;//BFS ์ด๋์ ์ํ ํ(x,y, distance)
bool visited[MAX_SIZE][MAX_SIZE] = { false, };//๋ฐฉ๋ฌธ์ฒดํฌ ๋ฐฐ์ด
fish_vector.clear();//๋ฌผ๊ณ ๊ธฐ ๋ค์ ๋ด์์ผํ๋๊น clear
move_q.push(make_pair(make_pair(shark.x, shark.y),0));//ํ์ฌ ์์น๋ถํฐ ํ์ ์์
map[shark.x][shark.y] = 0;//ํ์ฌ ์์น์์ ์ด๋ํ ๊ฑฐ๋๊น 0์ผ๋ก ํ์
visited[shark.x][shark.y] = true;//ํ์ฌ ์์น ๋ฐฉ๋ฌธ์ฒดํฌ
while(!move_q.empty()){//ํ์ํ ์์น๊ฐ ์์ ๋๊น์ง ๋ฐ๋ณต
int cur_x = move_q.front().first.first;
int cur_y = move_q.front().first.second;
int dist = move_q.front().second;
move_q.pop();
for (int i = 0; i < 4; i++) {//์ํ์ข์ฐ ํ์
int next_x = cur_x + direction[i][0];
int next_y = cur_y + direction[i][1];
if (next_x >= 0 && next_x < map_size && next_y >= 0 && next_y < map_size ) {
//์์ด๊ฐ ์ด๋ํ ์ ์๋ ๊ณณ: ์์ ์ ํฌ๊ธฐ๋ณด๋ค ์์ ์นธ & ๋ฐฉ๋ฌธํ ์ ์๋ ์นธ
if (map[next_x][next_y] <= shark.size && !visited[next_x][next_y]) {
visited[next_x][next_y] = true;
move_q.push(make_pair(make_pair(next_x, next_y), dist+1));
//๊ทธ ์๋ฆฌ๊ฐ 0์ด ์๋๊ณ (๋น์๋ฆฌX) ์๊ธฐ๋ณด๋ค ์์ ๋ฌผ๊ณ ๊ธฐ๊ฐ ์๋ค๋ฉด, ๋ฌผ๊ณ ๊ธฐ ๋ฒกํฐ์ ๋ฃ์ด์ฃผ๊ธฐ.
if (map[next_x][next_y] != 0 && map[next_x][next_y] < shark.size) {
Fish fish = {next_x, next_y, dist+1};
fish_vector.push_back(fish);
}
}
}
}
}
//ํ์ํ ์ ์๋ ๊ณณ์ ๋ค ๋ดค๋ค๋ฉด, ๋ฌผ๊ณ ๊ธฐ ์ ๋ ฌํด์ ๋จน์ผ๋ฌ ๊ฐ๊ธฐ.
if (fish_vector.size() >= 1) {
//๋ฌผ๊ณ ๊ธฐ ์ ๋ ฌ ํ ๋จน๊ธฐ
sort(fish_vector.begin(), fish_vector.end(), sortFish);
eatFish();
return fish_vector.size() - 1;
}
return 0;
}
//๋งจ ์ฒซ๋ฒ์งธ ๋ฌผ๊ณ ๊ธฐ ๋จน๊ธฐ
void eatFish() {
shark.x = fish_vector.front().x;
shark.y = fish_vector.front().y;
shark.eating_num += 1;
shark.time += fish_vector.front().distance;
map[shark.x][shark.y] = 9;
if (shark.eating_num == shark.size) {
shark.size += 1;
shark.eating_num = 0;
SearchBFS();//๋ฌผ๊ณ ๊ธฐ ํฌ๊ธฐ๊ฐ ๋๋ฉด ๋ฌผ๊ณ ๊ธฐ ๋ค์ ์ฐพ์์ผ ํจ
}
}
cf) ์ ๋จน์ ๋ถ๋ถ...
vector<Fish> fish_vector; ๋จน์ ์ ์๋ ๋ฌผ๊ณ ๊ธฐ๋ค์ ์ ์ฅํ ๋ฒกํฐ๋ฅผ SearchBFS() ํจ์ ์์ ์ ์๋ค๊ฐ ๋ฌผ๊ณ ๊ธฐ ํฌ๊ธฐ๊ฐ ๋์ด์ SearchBFS() ๋ฅผ ๋ค์ ์ํํ ํ return ํ๋ ๋ถ๋ถ์์ ์ด์ ์ ๋ค๊ณ ์๋ fish_vector๊ฐ์ ๋ฆฌํดํด์ main()์ ์ฌํ์๋ฌธ์ ์ํํ์ง ์๋ ๋ฌธ์ ๊ฐ ์์๋ค.
↑ 14๊น์ง ๊ฐ์ผํ๋๋ฐ, 10์์ fish_vector.size()-1 = 0์ main ์ผ๋ก ๋ฆฌํดํจ... ์ด์ ์ ๊ตฌํ๋ fish_vector.size(): 1 ๋๋ฅผ ๋ฆฌํดํด์...
vector<Fish> fish_vector; ๋ฅผ ์ ์ญ๋ณ์๋ก ๋นผ์ main()์ ์ฌํ์๋ฌธ์์ fish_vector์ ์ฌ์ด์ฆ๋ฅผ ์ฒดํฌํด์ค์ผ๋ก์จ ์ด์ ๊ฐ์ return ํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๋ฐ.
๋ ์ข์ ๋ฐฉ๋ฒ์ด ์๊ฒ ์ง๋ง.... 3์๊ฐ ๋๋๊ฑฐ๋ฆฐ ์ง๊ธ ๋ด๋จธ๋ฆฌ๋ ์ด๊ฒ ํ๊ณ์ธ๋ฏ...
'๐ Coding Test Study > Algorithm Problem' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++][BAEKJOON][Bruteforce] 2580๋ฒ ์ค๋์ฟ ํ์ด & ๋ฐ๋ก (0) | 2021.10.11 |
---|---|
[C++][BAEKJOON][TREE&DP] 2533๋ฒ ์ฌํ๋ง ์๋น์ค(SNS) (0) | 2021.10.04 |
[C++][ํ๋ก๊ทธ๋๋จธ์ค][Heap] ๋ ๋งต๊ฒ (0) | 2021.09.22 |
[C++][BAEKJOON][๋ธ๋ฃจํธํฌ์ค] 3085๋ฒ ์ฌํ ๊ฒ์ (0) | 2021.09.21 |
[C++][BEAKJOON][DP] ๋์ 1 (0) | 2021.09.21 |