[c++] ๋ฐฑ์ค€ 18809๋ฒˆ : Gaaaaaaaaaarden

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

์ฒซ๋ฒˆ์งธ ์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

struct seed {
    int y, x;
};

int map[50][50];
vector<seed> landToSeed;
vector<seed> Green;
vector<seed> Red;
int N, M, G, R;

vector<int> g;
vector<int> r;

int dir_y[4] = {0,1,0,-1};
int dir_x[4] = {1,0,-1,0};


void printVector(vector<int>& a) { // int์— land๋„ ๋„ฃ์„์ˆ˜ ์žˆ์„๊นŒ?
    vector<int>::iterator iter;
    for (iter = a.begin(); iter != a.end(); iter++) {
        cout << *iter << " ";
    }
    cout << endl;
}

void printLandVector(vector<seed> a) {
    for (int i = 0; i < a.size(); i++) {
        cout << a[i].y << " " << a[i].x << endl;
    }
}

void adjustSize() {
    int dif = Red.size()/R - Green.size()/G;
    if (dif>0) { // ๊ธธ์ด ์ฐจ์ด๊ฐ€ ์žˆ์œผ๋ฉด
        for (int i = 0; i < dif; i++) {
            int last = Green.size();
            for (int j = 0; j < G; j++) {
                Green.push_back(Green[last - G+j]);
            }
        }
    }
    else if (dif<0) {
        for (int i = 0; i < -dif; i++) {
            int last = Red.size();
            for (int j = 0; j < R; j++) {
                Red.push_back(Red[last - R + j]);
            }
        }
    }
}

void combi_R(int start, int land_size, vector<seed> tmp) { // ๋‚จ์€ ์ˆ˜ ์ค‘ R ์ˆœ์—ด ๋ฝ‘๊ธฐ
    if (r.size() == R) {
        for (int i = r.size() - 1; i >= 0; i--) { // Red ์ฑ„์šฐ๊ธฐ
            Red.push_back(tmp[r[i]]);
            tmp.erase(tmp.begin() + r[i]);
        }
        adjustSize();
        return;
    }
    for (int i = start + 1; i < land_size; i++) { // 10*5
        r.push_back(i);
        combi_R(i, land_size, tmp); // 5
        r.pop_back();
    }
    return;
}

void putGR() {
    vector<seed> tmp; // ๊ตฌ์กฐ์ฒด vector ๋ณต์‚ฌํ•˜๊ธฐ (๋” ๊ณต๋ถ€)
    for (int i = 0; i < landToSeed.size(); i++) { // 10
        seed tmp_seed; tmp_seed.y = landToSeed[i].y;  tmp_seed.x = landToSeed[i].x;
        tmp.push_back(tmp_seed);
    }

    for (int i = g.size()-1; i >= 0; i--) { // Green ์ฑ„์šฐ๊ธฐ
        Green.push_back(tmp[g[i]]);
        tmp.erase(tmp.begin() + g[i]);
    }

    combi_R(-1, tmp.size(),tmp); // 10*5
    return;
}

void combi_G(int start, int land_size) { // G ์กฐํ•ฉ ๋ฝ‘๊ธฐ
    if (g.size() == G) {
        putGR(); // 10*5
        return;
    }
    for (int i = start + 1; i < land_size; i++) { // 10*5*10*5 => 10^3 ์ •๋„
        g.push_back(i);
        combi_G(i, land_size); // ๊นŠ์ด 5
        g.pop_back();
    }
    return;
}

int getFlower(int** map) {
    int num = 0;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            if (map[i][j] == 3) {
                num++;
            }
        }
    }
    return num;
}
bool inMap(int y, int x) {
    if (y >= 0 && x >= 0 && y < N && x < M) {
        return true;
    }
    else {
        return false;
    }
}

int Sowing() {
    vector<int> result;
    queue<seed> G_queue;
    queue<seed> R_queue;
    int size = (int)Green.size()/G;
    int flower = 0;

    cout << "g.size? " << Green.size() << endl;
    cout << "r.size? " << Red.size() << endl;

    for (int i = 0; i < size; i++) { // 10^5
        int** tmp_map = new int*[N]; // ๋™์  ํ• ๋‹นํ•ด์„œ map ๋ณต์‚ฌ
        for (int j = 0; j < N; j++) {
            tmp_map[j] = new int[M];
        }
        for (int j = 0; j < N; j++) {
            for (int k = 0; k < M; k++) {
                if (map[j][k] == 2) // ์•ˆ ์ฑ„์›Œ์ง„ 2๋Š” ์—†์• ๋ฒ„๋ฆฌ๊ธฐ
                    tmp_map[j][k] = 1;
                else
                    tmp_map[j][k] = map[j][k];
            }
        }

        queue<seed> empty;
        swap(G_queue, empty);
        queue<seed> empty1;
        swap(R_queue, empty1);

        int x, y;
        for (int j = 0; j < G; j++) {
            y = Green[G*i + j].y; // ์ดˆ๋ก์ƒ‰ ๋ฐฐ์–‘์•ก ๋ฟŒ๋ฆฌ๊ธฐ
            x = Green[G*i + j].x;
            tmp_map[y][x] =0;
            //cout << "g : "<< y <<" " << x << endl;
            G_queue.push(Green[G*i + j]);
        }

        for (int j = 0; j < R; j++) {
            y = Red[R*i + j].y; // ๋นจ๊ฐ„์ƒ‰ ๋ฐฐ์–‘์•ก ๋ฟŒ๋ฆฌ๊ธฐ
            x = Red[R*i + j].x;
            tmp_map[y][x] = 0;
            //cout << "r : " << y << " " << x << endl;
            R_queue.push(Red[R*i + j]);
        }

        int change = 1;
        while (change) { // ๋ณ€ํ™”๊ฐ€ ์—†์„ ๋•Œ๊นŒ์ง€ ํ™•์‚ฐ ์ง„ํ–‰
            /*
            for (int j = 0; j < N; j++) {
                for (int k = 0; k < M; k++) {
                    cout << tmp_map[j][k] << " ";
                }
                cout << endl;
            }
            cout << endl;
            */
            change = 0;
            int g_size = G_queue.size();
            for (int j = 0; j < g_size; j++) { // ์ดˆ๋ก์ƒ‰ ๋ฐฐ์–‘์•ก ํ™•์‚ฐ
                int x_seed = G_queue.front().x; int y_seed = G_queue.front().y; 
                G_queue.pop();
                if (tmp_map[y_seed][x_seed] == 3) // ์ด๋ฏธ ๊ฝƒ ํ”ผ์šด ๊ณณ์ด๋ฉด ํ™•์‚ฐ๋Šฅ๋ ฅ x
                    continue;

                for (int k = 0; k < 4; k++) {
                    x_seed += dir_x[k]; y_seed += dir_y[k];
                    if (inMap(y_seed, x_seed)) {
                        int check = tmp_map[y_seed][x_seed];
                        if (check != 0 && check != 3 && check != -1) {
                            tmp_map[y_seed][x_seed] *= -1;
                            change += 1;
                            seed tmp_seed; tmp_seed.x = x_seed; tmp_seed.y = y_seed;
                            G_queue.push(tmp_seed);
                        }
                    }
                    x_seed -= dir_x[k]; y_seed -= dir_y[k];
                }
            }
            int r_size = R_queue.size();
            for (int j = 0; j < r_size; j++) { // ๋นจ๊ฐ„์ƒ‰ ๋ฐฐ์–‘์•ก ํ™•์‚ฐ
                int x_seed = R_queue.front().x; int y_seed = R_queue.front().y;
                R_queue.pop();
                if (tmp_map[y_seed][x_seed] == 3) // ์ด๋ฏธ ๊ฝƒ ํ”ผ์šด ๊ณณ์ด๋ฉด ํ™•์‚ฐ๋Šฅ๋ ฅ x
                    continue;

                for (int k = 0; k < 4; k++) {
                    x_seed += dir_x[k]; y_seed += dir_y[k];
                    if (inMap(y_seed, x_seed)) {
                        int check = tmp_map[y_seed][x_seed];
                        if (check != 0 && check != 3 && check != -3) {
                            tmp_map[y_seed][x_seed] *= -3;
                            if (tmp_map[y_seed][x_seed] == 3) { // ๊ฝƒ ํ”ผ์› ์œผ๋ฉด
                                change -= 1; // ๋‹ค์Œ์— ํ™•์‚ฐ x
                            }
                            else {
                                change += 1;
                                seed tmp_seed; tmp_seed.x = x_seed; tmp_seed.y = y_seed;
                                R_queue.push(tmp_seed);
                            }
                        }
                    }
                    x_seed -= dir_x[k]; y_seed -= dir_y[k];
                }
            }

            for (int j = 0; j < N; j++) {
                for (int k = 0; k < M; k++) {
                    if (tmp_map[j][k] < 0) {
                        tmp_map[j][k] = 0;
                    }
                }
            }
        }

        int flower_num = getFlower(tmp_map);
        if (flower_num > flower) {
            flower = flower_num;
            cout << flower << endl;
        }
    }
    return flower;
}

int main() {
    cin >> N >> M >> G >> R;
    int index = 0;

    for (int i = 0; i < N; i++) { // 10^3
        for (int j = 0; j < M; j++) {
            cin >> map[i][j];
            if (map[i][j] == 2) { // ๋ฐฐ์–‘์•ก์„ ๋ฟŒ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋•… ์ €์žฅ
                seed tmp; tmp.y = i; tmp.x = j;
                landToSeed.push_back(tmp);
            }
        }
    }
    /*
    cout << "landToSeed first: " << endl;
    printLandVector(landToSeed);
    */
    int land_size = landToSeed.size();
    combi_G(-1, land_size); // 10^3
    cout << Sowing();


}

ํ’€๋ฆฌ๊ธด ํ•˜๋Š”๋ฐ ๋ณต์žกํ•˜๊ณ  ์‹œ๊ฐ„ ์ดˆ๊ณผ

set์— ๋„ฃ์–ด์„œ ๊ฝƒํ”ผ์šธ ๊ณณ์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌํ˜„ํ•ด๋ณด๋ ค๊ณ  ํ–ˆ์œผ๋‚˜ ๊ฒน์น˜๋Š” ๋ถ€๋ถ„์„ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์—์„œ set์„ ๋ชจ๋‘ ์ˆœํšŒํ•ด์•ผํ•˜๋ฏ€๋กœ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋„ˆ๋ฌด ๋†’์•„์ง„๋‹ค.

์„ฑ๊ณต

vector<seed>::iterator iter;
for (iter = change_set.begin(); iter != change_set.end(); iter++) {
    seed tmp = *iter;
    if(tmp_map[tmp.y][tmp.x]<0)
        tmp_map[tmp.y][tmp.x] = 0;
}

while๋ฌธ ์•ˆ์—์„œ O(N*M)์˜ ์ด์ค‘ for๋ฌธ์„ ๋Œ๋ฉด์„œ ์Œ์ˆ˜์ธ ์œ„์น˜๋ฅผ ์ฐพ์•„์„œ 0์œผ๋กœ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ๋ฅผ ํ•œ vector ์•ˆ์— for๋ฌธ์˜ ํ˜„์žฌ ๋ฃจํ”„์—์„œ ๋ฐ”๋€(ํผ์ง„) ๋ฐฐ์–‘์•ก ์œ„์น˜๋ฅผ ์ €์žฅํ•ด๋‘์–ด ํ•ด๋‹น ์œ„์น˜๋งŒ ๊ฒ€์‚ฌํ•˜๊ณ  0์œผ๋กœ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ๋กœ ๋ฐ”๊พธ์—ˆ๋”๋‹ˆ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค. change_set์ด๋ผ๋Š” ์ถ”๊ฐ€๋กœ vector๋Š” ์œ„์ชฝ์— ์ •์˜ํ•ด์•ผํ•œ๋‹ค.

์ฝ”๋“œ ์„ค๋ช…

์œ„์น˜๋ฅผ ํŽธํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด seed๋ผ๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Œ! (x ์ขŒํ‘œ, y์ขŒํ‘œ๋กœ ๊ตฌ์„ฑ)

for (int i = 0; i < N; i++) { // 10^3
    for (int j = 0; j < M; j++) {
        cin >> map[i][j];
        if (map[i][j] == 2) { // ๋ฐฐ์–‘์•ก์„ ๋ฟŒ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋•… ์ €์žฅ
            seed tmp; tmp.y = i; tmp.x = j;
            landToSeed.push_back(tmp);
        }
    }
}

garden map์„ ์ €์žฅํ•˜๋ฉด์„œ ๋™์‹œ์— ๋ฐฐ์–‘์•ก์„ ๋ฟŒ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋•…์„ landToSeed๋ผ๋Š” vector์— ์ €์žฅ

void combi_G(int start, int land_size) { // G ์กฐํ•ฉ ๋ฝ‘๊ธฐ
    if (g.size() == G) {
        putGR(); // 10*5
        return;
    }
    for (int i = start + 1; i < land_size; i++) { // 10*5*10*5 => 10^3 ์ •๋„
        g.push_back(i);
        combi_G(i, land_size); // ๊นŠ์ด 5
        g.pop_back();
    }
    return;
}

combi_G => putGR => combi_R => adjustSize ํ•จ์ˆ˜๋ฅผ ๊ฑฐ์ณ ์กฐํ•ฉ์„ Green, Red vector์— ์ €์žฅ

adjustSize ํ•จ์ˆ˜๋Š” G๊ฐ€ ๋ฝ‘์€ ์กฐํ•ฉ์„ ์ œ์™ธํ•œ ์ˆ˜ ์ค‘ R์ด ์กฐํ•ฉ์„ ๊ฒฐ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— R์˜ ์กฐํ•ฉ ์ˆ˜๋งŒํผ G๊ฐ€ ๋ฐ˜๋ณต๋ผ์„œ ๋‚˜์™€์•ผํ•œ๋‹ค. ์ด๋ฅผ ๋งž์ถฐ์ฃผ๊ธฐ ์œ„ํ•จ์ด๋‹ค. (์•„๋ž˜์˜ ๊ทธ๋ฆผ์—์„œ 0,1,2๊ฐ€ 2๋ฒˆ ์ค‘๋ณต๋ผ์„œ ๋‚˜์˜ค๋Š” ๊ฒƒ)

int x, y;
for (int j = 0; j < G; j++) {
    y = Green[G*i + j].y; // ์ดˆ๋ก์ƒ‰ ๋ฐฐ์–‘์•ก ๋ฟŒ๋ฆฌ๊ธฐ
    x = Green[G*i + j].x;
    tmp_map[y][x] = 0;
    //cout << "g : "<< y <<" " << x << endl;
    G_queue.push(Green[G*i + j]);
}

for (int j = 0; j < R; j++) {
    y = Red[R*i + j].y; // ๋นจ๊ฐ„์ƒ‰ ๋ฐฐ์–‘์•ก ๋ฟŒ๋ฆฌ๊ธฐ
    x = Red[R*i + j].x;
    tmp_map[y][x] = 0;
    //cout << "r : " << y << " " << x << endl;
    R_queue.push(Red[R*i + j]);
}

์ €์žฅํ•ด๋‘” ์กฐํ•ฉ์„ ํ•œ๋ฌถ์Œ์”ฉ ๊บผ๋‚ด์™€์„œ (Green์—์„œ G๊ฐœ, Red์—์„œ R๊ฐœ์”ฉ) ๊ฐ๊ฐ -1, -3์„ map์— ๋„ฃ๋Š”๋‹ค. (๋ฐฐ์–‘์•ก์„ ๋ฟŒ๋ฆฐ๋‹ค.)

์ด ๋•Œ ์ฝ”๋“œ์—์„œ๋Š” 0์„ ๋„ฃ๊ฒŒ ๋˜์–ด์žˆ๋Š”๋ฐ, ์–ด์ฐจํ”ผ ๋‚˜์ค‘์— 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ค„ ๊ฒƒ์ด๋ผ ๊ทธ๋Ÿฐ ๊ฒƒ์ด๋‹ค.

while(change){
 // ๋„ˆ๋ฌด ๋งŽ์•„ ์ƒ๋žต ์œ„์˜ ์ฝ”๋“œ์— ์žˆ์Œ
}

๋ณ€ํ™”๊ฐ€ ๋”์ด์ƒ ์—†์„ ๋•Œ๊นŒ์ง€ queue์— ๋‹ด๊ธด ์ขŒํ‘œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด๊ฐ€๋ฉฐ ์ดˆ๋ก์ƒ‰ ๋ฐฐ์–‘์•ก์ด ํผ์ง„ ๋ถ€๋ถ„์€ -1์„ ๋นจ๊ฐ„์ƒ‰ ๋ฐฐ์–‘์•ก์ด ํผ์ง„ ๋ถ€๋ถ„์€ -3์„ ์ €์žฅํ•œ๋‹ค. ์ด ๋•Œ, ๋‘ ๋ฐฐ์–‘์•ก์ด ๋™์‹œ์— ๋‹ฟ์•„ ๊ฒฐ๊ณผ๊ฐ€ 3์ด ๋˜๋Š” ๋ถ€๋ถ„์—์„œ๋Š” ๊ฝƒ์ด ํ•€๋‹ค. (๊ฝƒ์ด ํ•€ ๊ฒƒ์€ ๋‚˜์ค‘์— 3์ธ ๊ฒƒ์˜ ๊ฐฏ์ˆ˜๋ฅผ ์ƒˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ณ„์‚ฐํ•œ๋‹ค.)

๋‹ค์Œ์— ํผ์งˆ ์œ„์น˜๋ฅผ ๊ฐ๊ฐ ์ €์žฅํ•ด์„œ ๊ฒน์น˜๋ฉด ๊ฝƒ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜๋ฅผ ํ•˜๋‚˜์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๋ฐฉ์‹์œผ๋กœ๋Š” ํผ์งˆ ์œ„์น˜์˜ ๊ฐฏ์ˆ˜^2์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ๋„ˆ๋ฌด ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค.

๋‹ค์Œ ๋ฃจํ”„์—์„œ๋Š” ํผ์ง„ ๋ฐฐ์–‘์•ก๋“ค์ด ๋‹ค์‹œ ์‚ฌ๋ฐฉ์œผ๋กœ ๋ฐฐ์–‘์•ก์„ ํผ๋œจ๋ฆด ํ…๋ฐ, ์ˆœ์„œ๊ฐ€ ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š๋„๋ก ํ˜„์žฌ ๋ฃจํ”„์—์„œ ํผ์ง„ ๋ฐฐ์–‘์•ก๋“ค์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค. (๊ฝƒ์„ ํ”ผ์šธ ์ˆ˜ ์—†๊ณ  ๋ฐฐ์–‘์•ก๋„ ํผ์งˆ ์ˆ˜ ์—†๋Š” ๊ณณ์ด๋ผ๋Š” ์˜๋ฏธ๋กœ ๊ทธ๋ƒฅ ํ˜ธ์ˆ˜์ฒ˜๋Ÿผ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ์—ˆ๋‹ค.)

๊นจ๋‹ฌ์€ ๊ฒƒ

์ •๋‹ต ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ๋ฐœ์ „์‹œํ‚ฌ ์ ์„ ์ ์–ด๋ณด์•˜๋‹ค.

์ฐธ๊ณ  : https://blog.encrypted.gg/938?category=730176

  1. fill ํ•จ์ˆ˜ ์‚ฌ์šฉ

fill(iter1,iter2,val); : ๋ฒ”์œ„ ๋‚ด(first๋ถ€ํ„ฐ(last-1)๊นŒ์ง€)์˜ ์›์†Œ๋“ค์„ val๋กœ ์ฑ„์šด๋‹ค.

  1. ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋”ฐ๋กœ ๋งŒ๋“ค์ง€ ๋ง๊ณ  pair ์‚ฌ์šฉ

๋ณธ์ธ์€ ๋”ฐ๋กœ ๊ตฌ์กฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ตฌํ˜„ํ–ˆ์œผ๋‚˜, pair๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋Ÿฌ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

pair<int,int> state[52][52];
queue<pair<int,int>> q;
  1. next_permutation

์กฐํ•ฉ์„ ๊ตฌํ˜„ํ•˜๋Š๋ผ ๊ต‰์žฅํžˆ ๋งŽ์€ ์‹œ๊ฐ„์„ ์†Œ์š”ํ•˜์˜€๋Š”๋ฐ, ์ˆœ์—ด์„ ๊ตฌํ˜„ํ•˜๋Š” ํ•จ์ˆ˜๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค :> ํ•˜์ง€๋งŒ ์กฐํ•ฉ์„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ฒ˜์Œ ๊ณต๋ถ€ํ•ด๋ณธ ๊ฒƒ์— ์˜์˜๋ฅผ ๋‘๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ •๋‹ต ๊ณต๊ฐœ ๋ธ”๋กœ๊ทธ์—์„œ๋„ ์กฐํ•ฉํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” '๋ฐฑํŠธ๋ž˜ํ‚น' ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฅธ ์ •๋‹ต์œผ๋กœ ์ž‘์„ฑํ•ด๋‘์—ˆ๋‹ค.

next_permutation(iter1, iter2); iter1์—์„œ iter2-1๊นŒ์ง€์˜ ์ˆœ์—ด์„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜, ํ˜ธ์ถœ ์‹œ๋งˆ๋‹ค ๋‹ค์Œ ์ˆœ์—ด๋กœ ๋ฐ”๋€Œ๊ฒŒ ํ•ด์คŒ

 

  1. bfs

์ดˆ๋ก, ๋นจ๊ฐ• ๋ฐฐ์–‘์•ก์„ ๋”ฐ๋กœ ํ™•์ธํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ Queue์— ๋“ค์–ด์˜จ ๋ฐฐ์–‘์•ก์˜ ์œ„์น˜๋ฅผ ๊บผ๋‚ด๋ฉด์„œ ์‚ฌ๋ฐฉ์„ ์ˆœํšŒํ•˜๋ฉฐ 3๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ํŒ๋‹จํ•˜์˜€๋‹ค. ์ด์— ์šฐ์„ ํ•˜๋Š” ์กฐ๊ฑด์œผ๋กœ ๋งต์•ˆ์— ์žˆ๊ณ , ํ˜ธ์ˆ˜๊ฐ€ ์•„๋‹Œ์ง€ ๋จผ์ € ํŒ๋‹จํ•˜์˜€๊ณ , ๋’ค์— ๋”ฐ๋ฅด๋Š” 3๊ฐ€์ง€ ๊ฒฝ์šฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

1) ์ƒ‰์— ๋”ฐ๋ฅธ ์ •๋ณด๊ฐ€ ๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ

ํ˜„์žฌ ์œ„์น˜์˜ ์ƒ‰์œผ๋กœ ์ฑ„์›Œ์ฃผ๊ณ  ์‹œ๊ฐ„์„ 1๋Š˜๋ ค์ฃผ๋ฉด ๋œ๋‹ค.

2) ๋นจ๊ฐ„์ƒ‰ ๋ฐฐ์–‘์•ก์ด ํผ์ ธ์žˆ๋Š” ๊ณณ์ผ ๊ฒฝ์šฐ

ํ˜„์žฌ ์œ„์น˜์˜ ์ƒ‰์ด ์ดˆ๋ก์ƒ‰์ด๊ณ  ๊ฒ€์‚ฌํ•˜๋Š” ์œ„์น˜์˜ ์‹œ๊ฐ„์ด ํ˜„์žฌ์‹œ๊ฐ„ +1์ด๋ผ๋ฉด ํ˜„์žฌ์‹œ๊ฐ„์— ๋™์‹œ์— ํผ์ง„ ๊ณณ์ด๋ฏ€๋กœ ๊ฝƒ์ด ํ•€๋‹ค.

3) ์ดˆ๋ก์ƒ‰ ๋ฐฐ์–‘์•ก์ด ํผ์ ธ์žˆ๋Š” ๊ณณ์ผ ๊ฒฝ์šฐ

ํ˜„์žฌ ์œ„์น˜์˜ ์ƒ‰์ด ๋นจ๊ฐ„์ƒ‰์ด๊ณ  ๊ฒ€์‚ฌํ•˜๋Š” ์œ„์น˜์˜ ์‹œ๊ฐ„์ด ํ˜„์žฌ์‹œ๊ฐ„ +1์ด๋ผ๋ฉด ํ˜„์žฌ์‹œ๊ฐ„์— ๋™์‹œ์— ํผ์ง„ ๊ณณ์ด๋ฏ€๋กœ ๊ฝƒ์ด ํ•€๋‹ค.

 

๋ณธ์ธ์€ ์ดˆ๋ก, ๋นจ๊ฐ„ ๋ฐฐ์–‘์•ก์„ ๋”ฐ๋กœ for๋ฌธ์„ ๋Œ๋ฉฐ ํ™•์ธํ–ˆ์œผ๋ฉฐ ์‹œ๊ฐ„์ด ๋งž๋Š” ๊ฒƒ์„ ํ™•์ฆํ•˜๊ธฐ ์œ„ํ•ด์„œ map์— ์ดˆ๋ก์€ -1, ๋นจ๊ฐ•์€ -3์„ ๊ณฑํ•˜๋„๋ก ํ•˜์—ฌ 3์ด ๋˜๋ฉด ๊ฝƒ์ด ํ•€๋‹ค๊ณ  ์ƒ๊ฐํ•˜์˜€๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•˜๋‹ˆ ๋ฐฐ์–‘์•ก์€ ํผ์กŒ์ง€๋งŒ ๊ฝƒ์€ ์•ˆ ํ•€ ๋ธ”๋ก์„ ๋‹ค์Œ์‹œ๊ฐ„์— ํ—ท๊ฐˆ๋ฆฌ์ง€ ์•Š๋„๋ก 0์œผ๋กœ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ฃผ์–ด์•ผํ•ด์„œ queue์— ๋“ค์–ด์žˆ๋Š” ์œ„์น˜์— ๋Œ€ํ•ด ์ˆœํšŒ๊ณผ์ •์ด ํ•„์š”ํ–ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์ •๋‹ต์ฒ˜๋Ÿผ ์‹œ๊ฐ„๊ณผ ์ƒ‰์ด ๋™์‹œ์— ํ‘œํ˜„๋  ์ˆ˜ ์žˆ๋„๋ก ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์งœ๋ฉด ๋œ๋‹ค.

์‹œ๊ฐ„์— ๋Œ€ํ•œ ์ •๋ณด๋„ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์‰ฝ๋‹ค๋Š” ๊ฒƒ์„ ์ƒ๊ฐ์น˜ ๋ชปํ–ˆ๋‹ค. ๊ธฐ๋ณธ์ ์ธ bfs์—์„œ ๋ฐฐ์šด ๋ถ€๋ถ„์ธ๋ฐ!

๋˜ํ•œ ๊ฝƒ์˜ ๊ฐฏ์ˆ˜๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ „์ฒด๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ 3์ธ ๊ณณ์˜ ๊ฐฏ์ˆ˜๋ฅผ ์„ธ์—ˆ๋Š”๋ฐ, ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๊ฝƒ์ด ํ•„ ๋•Œ๋งˆ๋‹ค 1์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” ๋ณ€์ˆ˜๋ฅผ ๋‘๋ฉด ๋œ๋‹ค.

๋ฐ˜์‘ํ˜•