์ƒˆ์†Œ์‹

์•Œ๊ณ ๋ฆฌ์ฆ˜/BaekJoon

[C++] BOJ 2933๋ฒˆ: ๋ฏธ๋„ค๋ž„

  • -
728x90

๋ฌธ์ œ

๋™๊ตด์— ์žˆ๋Š” ๋ฏธ๋„ค๋ž„์˜ ๋ชจ์–‘๊ณผ ๋‘ ์‚ฌ๋žŒ์ด ๋˜์ง„ ๋ง‰๋Œ€์˜ ๋†’์ด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋ชจ๋“  ๋ง‰๋Œ€๋ฅผ ๋˜์ง€๊ณ  ๋‚œ ์ดํ›„์— ๋ฏธ๋„ค๋ž„ ๋ชจ์–‘์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

์ž…๋ ฅ 1

5 6
. . . . . .
. . X X . .
. . X . . .
. X X X X .
1
3

์ถœ๋ ฅ 1

. . . . . .
. . . . . .
. . X X . .
. . X X . .
. X X X X .

์ฝ”๋“œ

#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
#define y first
#define x second
using namespace std;

//2933๋ฒˆ ๋ฏธ๋„ค๋ž„

//2์ฐจ์› ๋ฐฐ์—ด ์„ ์–ธ
char arr[101][101];
int visited[101][101];      //dfs๋ฅผ ์œ„ํ•œ ๋ฐฉ๋ฌธ ๋ฐฐ์—ด
int R, C;
vector<pair<int,int>> cluster;
int arrow[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };

void DFS(int yIdx, int xIdx) {
    if (arr[yIdx][xIdx] == '.' || visited[yIdx][xIdx]) return;
    visited[yIdx][xIdx] = true;
    cluster.push_back({yIdx,xIdx});
    //์ขŒ์šฐ์œ„์•„๋ž˜ ํƒ์ƒ‰
    for (int i = 0; i < 4; i++) {
        int ny = yIdx + arrow[i][0];
        int nx = xIdx + arrow[i][1];    
        if (nx >= 0 && nx < C && ny >= 0 && ny < R)
            DFS(ny, nx);
    }
}

void checkCluster() {
    memset(visited, 0, sizeof(visited));
    for (int a = 0; a < R; a++) {
        for (int b = 0; b < C; b++) {
            if (arr[a][b] == '.' || visited[a][b]) continue;
            cluster.clear();
            DFS(a,b);
            vector<int> low(C, -1);     //vector(์ปจํ…Œ์ด๋„ˆ ํฌ๊ธฐ, ๊ฐ๊ฐ ํ• ๋‹น๋  ๊ฐ’)
            for (int z = 0; z < cluster.size(); z++) {
                pair<int, int> p= cluster[z];
                low[p.x] = max(low[p.x], p.y);
                arr[p.y][p.x] = '.';
            }

            //์–ผ๋งˆ๋‚˜ ๋ฐ‘์œผ๋กœ ์˜ฎ๊ธธ์ง€ i์— ๋„ฃ๊ธฐ
            int lowmove = R;
            for (int i, j = 0; j < C; j++) {
                if (low[j] == -1) continue;
                i = low[j];

                //'.'์ด ์•„๋‹Œ๊ฒฝ์šฐ, ํƒ์ƒ‰ ๋†’์ด๊ฐ€ ๋†’์ด๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ
                while (i < R &&arr[i][j] == '.') {
                    i++;
                }
                lowmove = min(lowmove, i - low[j] - 1);
            }

            for (int i = 0; i < cluster.size(); i++) {
                pair<int, int> p = cluster[i];
                p.y += lowmove;
                arr[p.y][p.x] = 'x';
                visited[p.y][p.x] = true;
            }
        }
    }
    
}

void shoot(int orderNum,int height) {
    //์™ผ์ชฝ์ธ์ง€ ์˜ค๋ฅธ์ชฝ์ธ์ง€ ํŒ๋‹จ
    height = R - height;
    if (orderNum % 2 == 0) {
        for (int i = 0; i < C; i++) {
            if (arr[height][i] == 'x') {
                arr[height][i] = '.';
                break;
            }
        }
    }
    else {
        for (int i = C-1; i >= 0; i--) {
            if (arr[height][i] == 'x') {
                arr[height][i] = '.';
                break;
            }
        }
    }
    
    checkCluster();
}

int main() {
    
    cin.tie(NULL);
    cout.tie(NULL);
    ios::sync_with_stdio(false);


    cin >> R >> C;

    for (int i = 0; i < R; i++) {
        for (int j = 0; j < C; j++) {
            cin >> arr[i][j];
        }
    }
    int N,height=0;
    cin >> N;
    for (int i = 0; i < N; i++) {
        cin >> height;
        shoot(i, height);
    }

    for (int i = 0; i < R; i++) {
        for (int j = 0; j < C; j++) {
            cout << arr[i][j];
        }
        cout << "\n";
    }

    return 0;
}

*๊ฐ„๋‹จํ•œ ํ•ด์„ค*

checkCluster() ํ•จ์ˆ˜ ๋ถ€๋ถ„์€ https://100100e.tistory.com/152 ์ด ๋ธ”๋กœ๊ทธ ๋ถ„์˜ ๊ธ€์„ ์ฐธ๊ณ ํ•˜์—ฌ์„œ ์ œ์ž‘ํ•˜์˜€๋‹ค. ์ œ์ผ ๋‚˜๋ž‘ ์ƒ๊ฐ์ด ๋น„์Šทํ•˜๊ธฐ๋„ ํ–ˆ๊ณ  ์•Œ๊ธฐ ์‰ฝ๊ฒŒ ์ž‘์„ฑ๋˜์–ด์žˆ์–ด์„œ ์ข‹์•˜๋‹ค. checkCluster() ๋ถ€๋ถ„์„ ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…ํ•ด๋ณผ๊นŒ ์‹ถ๋‹ค.

 memset(visited, 0, sizeof(visited));
    for (int a = 0; a < R; a++) {
        for (int b = 0; b < C; b++) {

 

checkCluster๋Š” ๋ถ€๋ฉ”๋ž‘์„ ๋˜์ง„ ํ›„์— ๋–จ์–ด์ง€๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋“ค์„ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜๋กœ์จ ์‹คํ–‰๋œ๋‹ค. ๋”ฐ๋ผ์„œ DFS๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด visited ๋ฐฐ์—ด์„ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ค˜์•ผํ•œ๋‹ค. ๊ทธ๋ฅผ ์œ„ํ•ด memset ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์˜€๋‹ค. ๋‚˜๋จธ์ง€ for๋ฌธ์€ R x C ํฌ๊ธฐ์˜ ๋งต์„ for๋ฌธ์„ ํ†ตํ•ด ๋Œ๋ฆฐ๋‹ค.

if (arr[a][b] == '.' || visited[a][b]) continue;
cluster.clear();
DFS(a,b);

๊ทธ ๋‹ค์Œ์—๋Š” ํ•ด๋‹น ๋งต์˜ ์นธ์ด . ์œผ๋กœ ๋น„์–ด์žˆ๋Š” ์นธ์ด๊ฑฐ๋‚˜ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋ฐฐ์—ด์ผ ๊ฒฝ์šฐ ๊ทธ๋Œ€๋กœ ๋ฐ‘์˜ ๊ณ„์‚ฐ์„ ํ•˜์ง€ ์•Š๊ณ  ๋„˜์–ด๊ฐ„๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ DFS ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ํ•ด๋‹น ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ขŒ์šฐ์œ„์•„๋ž˜๋ฅผ ํƒ์ƒ‰ํ•ด์„œ cluster ๋ฒกํ„ฐ์— ๋„ฃ๋Š”๋‹ค.

vector<int> low(C, -1);     //vector(์ปจํ…Œ์ด๋„ˆ ํฌ๊ธฐ, ๊ฐ๊ฐ ํ• ๋‹น๋  ๊ฐ’)
for (int z = 0; z < cluster.size(); z++) {
    pair<int, int> p= cluster[z];
    low[p.x] = max(low[p.x], p.y);
    arr[p.y][p.x] = '.';
}

๊ทธ ํ›„์—  low ๋ผ๋Š” ๋•…์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฒกํ„ฐ ๋ฐฐ์—ด์„ ์„ ์–ธํ•œ๋‹ค. low(C,-1) ์ด๋ ‡๊ฒŒ ์„ ์–ธํ•˜๋ฉด C ํฌ๊ธฐ ๋งŒํผ์„ -1์˜ ๊ฐ’์œผ๋กœ ํ• ๋‹นํ•œ๋‹ค๋Š” ๋ง์ด๋‹ค. ๊ทธ ๋‹ค์Œ for๋ฌธ์„ ํ†ตํ•ด์„œ ์ €์žฅ๋œ cluster๋งŒํผ ๋Œ๋ ค์ฃผ๊ณ  ๋งŒ์•ฝ ํ•ด๋‹น ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋†’์ด ๊ฐ’์ธ p.y ๊ฐ’์ด ๋งŒ์•ฝ์— ๊ธฐ์กด์— ์ €์žฅ๋œ ๋†’์ด ๊ฐ’์ธ low[p.x]์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ ํฐ ๊ฐ’์„ low[p.x]์— ์ €์žฅํ•ด์ค€๋‹ค. ์ €์žฅํ•œ ๋‹ค์Œ์—๋Š” ํ•ด๋‹น ๊ฐ’์€ ๋‚˜์ค‘์— ๋‹ค์‹œ ๋–จ์–ด์ง„ ํด๋Ÿฌ์Šคํ„ฐ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ค„ ๊ฒƒ์ž„์œผ๋กœ ๋ฏธ๋ฆฌ .์œผ๋กœ ๋ณ€๊ฒฝ ์‹œ์ผœ์ค€๋‹ค.

int lowmove = R;
for (int i, j = 0; j < C; j++) {
    if (low[j] == -1) continue;
    i = low[j];

    //'.'์ด ์•„๋‹Œ๊ฒฝ์šฐ, ํƒ์ƒ‰ ๋†’์ด๊ฐ€ ๋†’์ด๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ
    while (i < R &&arr[i][j] == '.') {
        i++;
    }
    lowmove = min(lowmove, i - low[j] - 1);
}

์–ผ๋งŒํผ ๋ฐ‘์œผ๋กœ ์˜ฎ๊ธธ์ง€ ๊ณ„์‚ฐํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. lowmove ๋ณ€์ˆ˜์—๋Š” ๊ฐ€์žฅ ๋งŽ์ด ๋‚ด๋ ค๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ’ ๋†’์ด R๊ฐ’์„ ๋„ฃ์€ ๋‹ค์Œ ๋น„๊ตํ•ด๊ฐ€๋ฉด์„œ ์ž‘์œผ๋ฉด ๋ณ€๊ฒฝํ•˜๋Š” ํ˜•์‹์ด๋‹ค. if(low[j]==-1) continue; ์˜ ๊ฒฝ์šฐ ๋•…์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์—ฐ์‚ฐ์„ ํ•˜์ง€ ์•Š๊ณ  ๋„˜์–ด๊ฐ„๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ i = low[j];๋กœ ๋•…์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋†’์ด๋ฅผ ๋„ฃ๋Š”๋‹ค. ๊ทธ ํ›„ while๋ฌธ์„ ํ†ตํ•ด์„œ ๋งŒ์•ฝ ํ•ด๋‹น ์ขŒํ‘œ์˜ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋นˆ๊ณต๊ฐ„์ธ ๊ฒฝ์šฐ ๋‚ด๋ ค๊ฐ€์•ผํ•  ์นธ์˜ ๊ฐ’์ธ i๋ฅผ ++ํ•ด์ค€๋‹ค. ํ•ด๋‹น while๋ฌธ์ด ๊ธ‘๋‚˜๊ณ  ๋‚˜๋ฉด min ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ธฐ์กด์˜ lowmove ๊ฐ’๊ณผ i-low[j]-1์„ ๋น„๊ตํ•œ๋‹ค. arr[i][j]์˜ ๊ฒฝ์šฐ ์•„๊นŒ ์œ„์—์„œ .์œผ๋กœ ๋งŒ๋“ค์–ด๋†“์•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•œ๊ฐœ๊ฐ€ ๋” ์„ธ์–ด์ง„๋‹ค. ๋”ฐ๋ผ์„œ ๋‚ด๋ ค๊ฐ€์•ผํ•  ์นธ์˜ ์ˆ˜ i ์—์„œ -1์„ ํ•œ ๋‹ค์Œ ๊ธฐ์กด ๋†’์ด์ธ low[j]๋ฅผ ๋นผ์ฃผ๋ฉด ๋‚ด๋ ค๊ฐ€์•ผํ•  ์นธ์˜ ๊ฐฏ์ˆ˜๊ฐ€ ๋‚˜์˜จ๋‹ค.

for (int i = 0; i < cluster.size(); i++) {
                pair<int, int> p = cluster[i];
                p.y += lowmove;
                arr[p.y][p.x] = 'x';
                visited[p.y][p.x] = true;
}

๋งˆ์ง€๋ง‰์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฐฏ์ˆ˜ ๋งŒํผ for๋ฌธ์„ ๋Œ๋ ค์„œ lowmove ๋งŒํผ ๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์˜ฎ๊ฒจ์ค€๋‹ค.

 

 

 

*์ด ๋ฐฉ๋ฒ•๋งŒ์ด ๋งž๋Š” ์ •๋‹ต์€ ์•„๋‹™๋‹ˆ๋‹ค.

ํ›จ์”ฌ ์ข‹๊ณ  ๋น ๋ฅธ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€ํ•˜์‹œ๋Š” ๋ถ„๋“ค ํ™”์ดํŒ…! '0'/*

๋ฐ˜์‘ํ˜•
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.