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

2022. 6. 13. 10:49ยท์•Œ๊ณ ๋ฆฌ์ฆ˜/BaekJoon
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'/*

๋ฐ˜์‘ํ˜•

'์•Œ๊ณ ๋ฆฌ์ฆ˜ > BaekJoon' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[C++] BOJ 2749๋ฒˆ: ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ 3  (0) 2022.06.20
[C++] BOJ 2244๋ฒˆ: ๋ฏผ์ฝ”์šฐ์Šคํ‚ค ํ•ฉ  (0) 2022.06.13
[C++] BOJ 1655๋ฒˆ: ๊ฐ€์šด๋ฐ๋ฅผ ๋งํ•ด์š”  (1) 2022.06.08
[C++] BOJ 3190๋ฒˆ: ๋ฑ€  (0) 2022.03.25
[C++] BOJ 2480๋ฒˆ: ์ฃผ์‚ฌ์œ„ ์„ธ๊ฐœ  (0) 2022.03.19
'์•Œ๊ณ ๋ฆฌ์ฆ˜/BaekJoon' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [C++] BOJ 2749๋ฒˆ: ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ 3
  • [C++] BOJ 2244๋ฒˆ: ๋ฏผ์ฝ”์šฐ์Šคํ‚ค ํ•ฉ
  • [C++] BOJ 1655๋ฒˆ: ๊ฐ€์šด๋ฐ๋ฅผ ๋งํ•ด์š”
  • [C++] BOJ 3190๋ฒˆ: ๋ฑ€
KiTFOx
KiTFOx
  • KiTFOx
    KiTFOx's Notepad ๐Ÿ“
    KiTFOx
  • ๊ณต์ง€์‚ฌํ•ญ

    • ๐Ÿ“ข KiTFOx
  • 250x250
    • KiTFOx (118)
      • ๊ณต๋ถ€ (8)
        • Cใ†C++ (7)
        • Design Pattern (2)
        • Crowd Simulation (2)
        • LearnOpenGL ๋ฒˆ์—ญ (3)
        • OpenGL ์ž๋ฃŒ ๋ฒˆ์—ญ (2)
        • OpenGL (1)
        • UE ์ž๋ฃŒ ๋ฒˆ์—ญ (1)
        • AR (0)
        • OpenCV (0)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜ (50)
        • ์ž๋ฃŒ๊ตฌ์กฐ (3)
        • BaekJoon (35)
        • Programmers (11)
      • OpenGL ๋”ฐ๋ผ๊ฐ€๊ธฐ (2)
      • ๊ฒŒ์ž„์—”์ง„ (15)
        • Unity (13)
        • UE4 (0)
        • UE5 (2)
      • ๋ฉ”ํƒ€๋ฒ„์Šค (4)
        • Engage VR (3)
        • Altspace VR (1)
      • ํฌํŠธํด๋ฆฌ์˜ค ํ”„๋กœ์ ํŠธ (2)
        • NewRo (1)
        • Amaimon(Unity3D) (0)
        • ArenaSurvival(UE5) (0)
      • ๊ฐœ๋ฐœ์ผ์ง€ (1)
        • Pub-Simulator (1)
        • Project-B (0)
      • ๋„คํŠธ์›Œํฌ (4)
      • Etc Study (5)
      • ๋Œ€์™ธํ™œ๋™ (8)
        • ํฌ๋ž˜ํ”„ํ†ค ์ •๊ธ€ ๊ฒŒ์ž„๋žฉ (6)
      • ํšŒ๊ณ ๋ก (0)
      • ๊ฒŒ์ž„ ํ•œ๊ธ€ํŒจ์น˜ (0)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
KiTFOx
[C++] BOJ 2933๋ฒˆ: ๋ฏธ๋„ค๋ž„
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”