๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/BOJ

[C++/BOJ] 16236 : ์•„๊ธฐ ์ƒ์–ด (bfs/dfs)

https://www.acmicpc.net/problem/16236

 

๋ฌธ์ œ

N×N ํฌ๊ธฐ์˜ ๊ณต๊ฐ„์— ๋ฌผ๊ณ ๊ธฐ M๋งˆ๋ฆฌ์™€ ์•„๊ธฐ ์ƒ์–ด 1๋งˆ๋ฆฌ๊ฐ€ ์žˆ๋‹ค. ๊ณต๊ฐ„์€ 1×1 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ํ•œ ์นธ์—๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์ตœ๋Œ€ 1๋งˆ๋ฆฌ ์กด์žฌํ•œ๋‹ค.

์•„๊ธฐ ์ƒ์–ด์™€ ๋ฌผ๊ณ ๊ธฐ๋Š” ๋ชจ๋‘ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ์ด ํฌ๊ธฐ๋Š” ์ž์—ฐ์ˆ˜์ด๋‹ค. ๊ฐ€์žฅ ์ฒ˜์Œ์— ์•„๊ธฐ ์ƒ์–ด์˜ ํฌ๊ธฐ๋Š” 2์ด๊ณ , ์•„๊ธฐ ์ƒ์–ด๋Š” 1์ดˆ์— ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ํ•œ ์นธ์”ฉ ์ด๋™ํ•œ๋‹ค.

์•„๊ธฐ ์ƒ์–ด๋Š” ์ž์‹ ์˜ ํฌ๊ธฐ๋ณด๋‹ค ํฐ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์€ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๊ณ , ๋‚˜๋จธ์ง€ ์นธ์€ ๋ชจ๋‘ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์•„๊ธฐ ์ƒ์–ด๋Š” ์ž์‹ ์˜ ํฌ๊ธฐ๋ณด๋‹ค ์ž‘์€ ๋ฌผ๊ณ ๊ธฐ๋งŒ ๋จน์„ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ํฌ๊ธฐ๊ฐ€ ๊ฐ™์€ ๋ฌผ๊ณ ๊ธฐ๋Š” ๋จน์„ ์ˆ˜ ์—†์ง€๋งŒ, ๊ทธ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์€ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

์•„๊ธฐ ์ƒ์–ด๊ฐ€ ์–ด๋””๋กœ ์ด๋™ํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ๋” ์ด์ƒ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ๊ณต๊ฐ„์— ์—†๋‹ค๋ฉด ์•„๊ธฐ ์ƒ์–ด๋Š” ์—„๋งˆ ์ƒ์–ด์—๊ฒŒ ๋„์›€์„ ์š”์ฒญํ•œ๋‹ค.
  • ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ 1๋งˆ๋ฆฌ๋ผ๋ฉด, ๊ทธ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์œผ๋Ÿฌ ๊ฐ„๋‹ค.
  • ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ 1๋งˆ๋ฆฌ๋ณด๋‹ค ๋งŽ๋‹ค๋ฉด, ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์œผ๋Ÿฌ ๊ฐ„๋‹ค.
    • ๊ฑฐ๋ฆฌ๋Š” ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ์žˆ๋Š” ์นธ์—์„œ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์œผ๋กœ ์ด๋™ํ•  ๋•Œ, ์ง€๋‚˜์•ผํ•˜๋Š” ์นธ์˜ ๊ฐœ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์ด๋‹ค.
    • ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€๊นŒ์šด ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ๋งŽ๋‹ค๋ฉด, ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ, ๊ทธ๋Ÿฌํ•œ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์—ฌ๋Ÿฌ๋งˆ๋ฆฌ๋ผ๋ฉด, ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋Š”๋‹ค.

์•„๊ธฐ ์ƒ์–ด์˜ ์ด๋™์€ 1์ดˆ ๊ฑธ๋ฆฌ๊ณ , ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ์ฆ‰, ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์œผ๋กœ ์ด๋™ํ–ˆ๋‹ค๋ฉด, ์ด๋™๊ณผ ๋™์‹œ์— ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋Š”๋‹ค. ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์œผ๋ฉด, ๊ทธ ์นธ์€ ๋นˆ ์นธ์ด ๋œ๋‹ค.

์•„๊ธฐ ์ƒ์–ด๋Š” ์ž์‹ ์˜ ํฌ๊ธฐ์™€ ๊ฐ™์€ ์ˆ˜์˜ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์„ ๋•Œ ๋งˆ๋‹ค ํฌ๊ธฐ๊ฐ€ 1 ์ฆ๊ฐ€ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํฌ๊ธฐ๊ฐ€ 2์ธ ์•„๊ธฐ ์ƒ์–ด๋Š” ๋ฌผ๊ณ ๊ธฐ๋ฅผ 2๋งˆ๋ฆฌ ๋จน์œผ๋ฉด ํฌ๊ธฐ๊ฐ€ 3์ด ๋œ๋‹ค.

๊ณต๊ฐ„์˜ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ๋ช‡ ์ดˆ ๋™์•ˆ ์—„๋งˆ ์ƒ์–ด์—๊ฒŒ ๋„์›€์„ ์š”์ฒญํ•˜์ง€ ์•Š๊ณ  ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์žก์•„๋จน์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๊ณต๊ฐ„์˜ ํฌ๊ธฐ N(2 ≤ N ≤ 20)์ด ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ณต๊ฐ„์˜ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ณต๊ฐ„์˜ ์ƒํƒœ๋Š” 0, 1, 2, 3, 4, 5, 6, 9๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ์•„๋ž˜์™€ ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค.

  • 0: ๋นˆ ์นธ
  • 1, 2, 3, 4, 5, 6: ์นธ์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ์˜ ํฌ๊ธฐ
  • 9: ์•„๊ธฐ ์ƒ์–ด์˜ ์œ„์น˜

์•„๊ธฐ ์ƒ์–ด๋Š” ๊ณต๊ฐ„์— ํ•œ ๋งˆ๋ฆฌ ์žˆ๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ์—„๋งˆ ์ƒ์–ด์—๊ฒŒ ๋„์›€์„ ์š”์ฒญํ•˜์ง€ ์•Š๊ณ  ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์žก์•„๋จน์„ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค.


 

์ œ๋ชฉ์€ ๊ท€์—ฝ์ง€๋งŒ ๋‚œ์ด๋„๋Š” ๊ณจ๋“œ 3..

์‚ฌ์‹ค ํ’€๋งŒํ–ˆ๋Š”๋ฐ ํ•œ๊ฐ€์ง€ ํฌ์ธํŠธ๋ฅผ ๋†“์ณ์„œ ์˜ˆ์‹œ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค 4๋ฒˆ์„ ๊ณ„์† ํ‹€๋ ธ๋‹ค.

 

์šฐ์„ ์ˆœ์œ„๊ฐ€ ์œ„ > ์™ผ์ชฝ์ธ๋ฐ ์ด๊ฑธ ๊ทธ๋ƒฅ ํƒ์ƒ‰๊ณผ์ • ์•ˆ์—์„œ ๋ฐ”๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค!

๊ทธ๋ž˜์„œ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์ฐพ์•„๋†“๊ณ  ๋‹ค์‹œ ์ด์ค‘๋ฐ˜๋ณต๋ฌธ ๋Œ๋ ค์„œ ํ–‰ > ์—ด ์ˆœ์œผ๋กœ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋˜๋Š” ๊ฑธ ์ฐพ์•„์„œ ๋ฆฌํ„ดํ•ด์ค˜์•ผ ํ•œ๋‹ค.

๋‹ค๋ฅธ๊ฑฐ ๋‹ค ํ•ด๋†“๊ณ  ์ด๊ฑฐ๋•Œ๋ฌธ์— ์ฝ”๋“œ ๋‹ค์‹œ ๊ฐˆ์•„์—Ž์Œ ^^..

๋‚˜๋ฆ„ ์‹ ๋ฐ•ํ•œ ๋ฌธ์ œ์˜€๋‹ค!! ๐Ÿค“

 

 

๋‚˜์˜ ํ’€์ด

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int n;
int map[21][21];
int level = 2;
int dx[4] = {-1, 0, 1, 0}; // ์œ„, ์™ผ์ชฝ ์šฐ์„ 
int dy[4] = {0, -1, 0, 1};
pair<int, int> now;
int eat = 0;
int timer = 0;

bool canGo(int x, int y,int visited[21][21]){
    if(x<0 || y<0 || x>=n || y>=n) return false;
    if(map[x][y]>level) return false;
    if(visited[x][y]) return false;
    return true;
}

bool bfs(){
    int step[21][21] = {0};
    int visited[21][21] = {0};
    int canEat[21][21] = {0};
    int minDist = 401;
    queue<pair<int, int>> q;
    q.push(now); // ์ƒ์–ด์˜ ํ˜„์žฌ ์œ„์น˜์—์„œ ์‹œ์ž‘
    visited[now.first][now.second] = 1;
    while(!q.empty()){
        pair<int, int> a = q.front();
        q.pop();
        for (int i = 0; i < 4; ++i){
            int nx = a.first + dx[i];
            int ny = a.second + dy[i];
            if(canGo(nx, ny, visited)){
                q.push({nx, ny});
                step[nx][ny] = step[a.first][a.second] + 1;
                visited[nx][ny] = 1;
                if(map[nx][ny]<level && map[nx][ny]>0) { // ์ž‘์€ ๋ฌผ๊ณ ๊ธฐ์— ๋„์ฐฉ ์‹œ ์œ„์น˜์ด๋™, ๋จน๊ธฐ
                    canEat[nx][ny] = 1;
                    if(minDist > step[nx][ny]) minDist = step[nx][ny];
                }
            }
        }
    }
    for (int i = 0; i < n; ++i){
        for (int j = 0; j < n; ++j){
            if(step[i][j]==minDist && canEat[i][j]){
                now = make_pair(i, j);
                map[i][j] = 0;
                eat++;
                timer += step[i][j];
                return true;
            }
        }
    }
    return false;
}

int main(){
    cin >> n;
    for (int i = 0; i < n; ++i){
        for (int j = 0; j < n; ++j){
            cin >> map[i][j];
            if(map[i][j]==9){
                now = make_pair(i, j);
                map[i][j] = 0;
            }
        }
    }

    while(1){
        bool c = false;
        c = bfs();
        if(level == eat){
            eat = 0;
            level++;
        }
        if (!c) break;
    }
    cout << timer;
}