[c++] BOJ 14502 :: ์—ฐ๊ตฌ์†Œ

๋‚œ์ด๋„ : ๊ณจ๋“œ 5

๊ฑธ๋ฆฐ ์‹œ๊ฐ„ : 1์‹œ๊ฐ„

 

๋ฌธ์ œ

์—ฐ๊ตฌ์†Œ ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์„œ๊ธฐ 2012๋…„! ๋“œ๋””์–ด 2๋…„๊ฐ„ ์ˆ˜๋งŽ์€ ๊ตญ๋ฏผ๋“ค์„ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•œ ๊ฒŒ์ž„ ACM Craft (Association of Construction Manager Craft)๊ฐ€ ๋ฐœ๋งค๋˜์—ˆ๋‹ค.

์ด ๊ฒŒ์ž„์€ ์ง€๊ธˆ๊นŒ์ง€ ๋‚˜์˜จ ๊ฒŒ์ž„๋“ค๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ACMํฌ๋ž˜ํ”„ํŠธ๋Š” ๋‹ค์ด๋‚˜๋ฏนํ•œ ๊ฒŒ์ž„ ์ง„ํ–‰์„ ์œ„ํ•ด ๊ฑด๋ฌผ์„ ์ง“๋Š” ์ˆœ์„œ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ์ง€ ์•Š๋‹ค. ์ฆ‰, ์ฒซ ๋ฒˆ์งธ ๊ฒŒ์ž„๊ณผ ๋‘ ๋ฒˆ์งธ ๊ฒŒ์ž„์ด ๊ฑด๋ฌผ์„ ์ง“๋Š” ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜๋„ ์žˆ๋‹ค. ๋งค ๊ฒŒ์ž„์‹œ์ž‘ ์‹œ ๊ฑด๋ฌผ์„ ์ง“๋Š” ์ˆœ์„œ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋˜ํ•œ ๋ชจ๋“  ๊ฑด๋ฌผ์€ ๊ฐ๊ฐ ๊ฑด์„ค์„ ์‹œ์ž‘ํ•˜์—ฌ ์™„์„ฑ์ด ๋  ๋•Œ๊นŒ์ง€ Delay๊ฐ€ ์กด๋ฌธ์ œ

์ธ์ฒด์— ์น˜๋ช…์ ์ธ ๋ฐ”์ด๋Ÿฌ์Šค๋ฅผ ์—ฐ๊ตฌํ•˜๋˜ ์—ฐ๊ตฌ์†Œ์—์„œ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์œ ์ถœ๋˜์—ˆ๋‹ค. ๋‹คํ–‰ํžˆ ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ์•„์ง ํผ์ง€์ง€ ์•Š์•˜๊ณ , ๋ฐ”์ด๋Ÿฌ์Šค์˜ ํ™•์‚ฐ์„ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ ์—ฐ๊ตฌ์†Œ์— ๋ฒฝ์„ ์„ธ์šฐ๋ ค๊ณ  ํ•œ๋‹ค.

์—ฐ๊ตฌ์†Œ๋Š” ํฌ๊ธฐ๊ฐ€ N×M์ธ ์ง์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ง์‚ฌ๊ฐํ˜•์€ 1×1 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ์—ฐ๊ตฌ์†Œ๋Š” ๋นˆ ์นธ, ๋ฒฝ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ๋ฒฝ์€ ์นธ ํ•˜๋‚˜๋ฅผ ๊ฐ€๋“ ์ฐจ์ง€ํ•œ๋‹ค.

์ผ๋ถ€ ์นธ์€ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, ์ด ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ๋นˆ ์นธ์œผ๋กœ ๋ชจ๋‘ ํผ์ ธ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์ƒˆ๋กœ ์„ธ์šธ ์ˆ˜ ์žˆ๋Š” ๋ฒฝ์˜ ๊ฐœ์ˆ˜๋Š” 3๊ฐœ์ด๋ฉฐ, ๊ผญ 3๊ฐœ๋ฅผ ์„ธ์›Œ์•ผ ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์™€ ๊ฐ™์ด ์—ฐ๊ตฌ์†Œ๊ฐ€ ์ƒ๊ธด ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด์ž.

2 0 0 0 1 1 0
0 0 1 0 1 2 0
0 1 1 0 1 0 0
0 1 0 0 0 0 0
0 0 0 0 0 1 1
0 1 0 0 0 0 0
0 1 0 0 0 0 0

์ด๋•Œ, 0์€ ๋นˆ ์นธ, 1์€ ๋ฒฝ, 2๋Š” ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ์žˆ๋Š” ๊ณณ์ด๋‹ค. ์•„๋ฌด๋Ÿฐ ๋ฒฝ์„ ์„ธ์šฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๋ฐ”์ด๋Ÿฌ์Šค๋Š” ๋ชจ๋“  ๋นˆ ์นธ์œผ๋กœ ํผ์ ธ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

2ํ–‰ 1์—ด, 1ํ–‰ 2์—ด, 4ํ–‰ 6์—ด์— ๋ฒฝ์„ ์„ธ์šด๋‹ค๋ฉด ์ง€๋„์˜ ๋ชจ์–‘์€ ์•„๋ž˜์™€ ๊ฐ™์•„์ง€๊ฒŒ ๋œ๋‹ค.

2 1 0 0 1 1 0
1 0 1 0 1 2 0
0 1 1 0 1 0 0
0 1 0 0 0 1 0
0 0 0 0 0 1 1
0 1 0 0 0 0 0
0 1 0 0 0 0 0

๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์ง„ ๋’ค์˜ ๋ชจ์Šต์€ ์•„๋ž˜์™€ ๊ฐ™์•„์ง„๋‹ค.

2 1 0 0 1 1 2
1 0 1 0 1 2 2
0 1 1 0 1 2 2
0 1 0 0 0 1 2
0 0 0 0 0 1 1
0 1 0 0 0 0 0
0 1 0 0 0 0 0

๋ฒฝ์„ 3๊ฐœ ์„ธ์šด ๋’ค, ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ํผ์งˆ ์ˆ˜ ์—†๋Š” ๊ณณ์„ ์•ˆ์ „ ์˜์—ญ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์œ„์˜ ์ง€๋„์—์„œ ์•ˆ์ „ ์˜์—ญ์˜ ํฌ๊ธฐ๋Š” 27์ด๋‹ค.

์—ฐ๊ตฌ์†Œ์˜ ์ง€๋„๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์•ˆ์ „ ์˜์—ญ ํฌ๊ธฐ์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

ํ’€์ด

  • ๋ฒฝ 3๊ฐœ๋ฅผ ๊ณ ๋ฅด๋Š” ๊ฑด ์กฐํ•ฉ์œผ๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.
    • 64N3์ด ์ตœ๋Œ€ ๊ฐ€๋Šฅ ๊ฒฝ์šฐ์˜ ์ˆ˜์ด๋ฏ€๋กœ ๊ทธ๋ฆฌ ํฌ์ง€ ์•Š๋‹ค.
  • ๊ณจ๋ผ์ง„ 3๊ฐœ์˜ ๋ฒฝ์„ map์— ๋ฐ˜์˜ํ•˜๊ณ  ๋…์ด ํผ์ง€๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์€ BFS๋กœ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • dfs๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

์ฝ”๋“œ

#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#include <cstring> // memcpy์„ ์œ„ํ•ด ํ•„์š”

using namespace std;

int N, M;
int map[8][8];
vector<pair<int, int>> candid;
vector<pair<int, int>> poision;
int direction[4][2] = { {0,-1},{0,1},{1,0},{-1,0} };

int calArea(vector<pair<int,int>>& toWall) {
    queue<pair<int,int>> que;
    int map_copy[8][8]; memcpy(map_copy, map, sizeof(map)); // ๊ธฐ์กด ๋งต ๋ณต์‚ฌํ•ด์„œ ์‚ฌ์šฉ

    for (int i = 0; i < toWall.size(); i++) {
        auto tmp = toWall[i];
        map_copy[tmp.first][tmp.second] = 1; // ๋ฒฝ ์ถ”๊ฐ€ํ•˜๊ธฐ
    }

    for (int i = 0; i < poision.size(); i++) // ๋… ์œ„์น˜ ์ €์žฅ
        que.push(poision[i]);

    while (!que.empty()) {
        pair<int, int> pos = que.front(); que.pop();
        for (int i = 0; i < 4; i++) {
            int x = pos.first + direction[i][0];
            int y = pos.second + direction[i][1];
            if (x < 0 || y < 0 || x >= N || y>=M)
                continue;
            if (map_copy[x][y] != 0)
                continue;
            // ์œ„์น˜๊ฐ€ ๋งต ์•ˆ์— ์žˆ๋Š” 0์ด๋ฉด 2๋กœ ๋งŒ๋“ค๊ธฐ
            map_copy[x][y] = 2;
            que.push(make_pair(x, y));
        }
    }

    // ์•ˆ์ „๊ตฌ์—ญ ์„ธ๊ธฐ
    int res = 0;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            if (map_copy[i][j] == 0)
                res++;
        }
    }
    return res;
}

int maxArea() {
    // ์ตœ๋Œ€ ์•ˆ์ „๊ตฌ์—ญ์„ ์ฐพ๋Š” ํ•จ์ˆ˜

    int area = -1; // ์•ˆ์ „๊ตฌ์—ญ
    int size = candid.size();
    vector<int> zeroOne(size); // 0,1๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋Š” ์กฐํ•ฉ์„ ์œ„ํ•œ ์ž„์‹œ ๋ฒกํ„ฐ

    for (int i = size-1; i >= size-3; i--) {
        // ๋’ค์—์„œ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด์•ผ next_permutation์ด ์ œ๋Œ€๋กœ ๋™์ž‘
        zeroOne[i] = 1; // 3๊ฐœ 1๋กœ ๋งŒ๋“ค๊ธฐ
    }

    do {
        vector<pair<int, int>> toWall;
        for (int i = 0; i < size; i++) {
            if (zeroOne[i] == 1) {
                toWall.push_back(candid[i]); // ํ›„๋ณด ์ค‘ ๋ฒฝ์ด ๋  ๊ฒƒ ๊ณ ๋ฅด๊ธฐ
            }
        }
        area = max(calArea(toWall), area); // ์ตœ๋Œ€ ์•ˆ์ „๊ตฌ์—ญ ๊ตฌํ•˜๊ธฐ
    } while (next_permutation(zeroOne.begin(), zeroOne.end()));

    return area;
}

int main() {
    // 9์‹œ 20๋ถ„ ์‹œ์ž‘ => 10์‹œ 20๋ถ„ ๋
    // ์•ˆ์ „์˜์—ญ ํฌ๊ธฐ์˜ ์ตœ๋Œ€๊ฐ’

    // ์ž…๋ ฅ => ์ž‘์Œ
    cin >> N >> M;

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            cin >> map[i][j];
            if (map[i][j] == 0) {
                candid.push_back(make_pair(i, j)); // ๋ฒฝ ํ›„๋ณด ์ €์žฅ (0)
            }else if (map[i][j] == 2) {
                poision.push_back(make_pair(i, j)); // ๋… ์ €์žฅ (2)
            }
        }
    }
    cout << maxArea() << '\n';
}

 

๊ธฐ์–ตํ•ด๋‘˜ ๊ฒƒ

  • memcpy(copy๋  vector, copyํ•  vector, ์‚ฌ์ด์ฆˆ);
๋ฐ˜์‘ํ˜•