๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/๊ตฌ๋ฆ„ ์ฑŒ๋ฆฐ์ง€

[๊ตฌ๋ฆ„ํ†ค ์ฑŒ๋ฆฐ์ง€] 4์ฃผ์ฐจ ํ•™์Šต ์ผ๊ธฐ #2 (20์ผ์ฐจ) & ํ›„๊ธฐ

by ๋Œ€๋ณต2 2023. 9. 9.

 

๋ฌธ์ œ ๋งํฌ

 

๊ตฌ๋ฆ„LEVEL

๋‚œ์ด๋„๋ณ„ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•จ์œผ๋กœ์จ SW ์—ญ๋Ÿ‰์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

level.goorm.io

 

 

 

 

๋ฌธ์ œ ์„ค๋ช…

 

 

์ž…๋ ฅ 

 

 

์ถœ๋ ฅ

 

 

๋ฌธ์ œ ์ดํ•ด

์ด์ „์— ํ’€์—ˆ๋˜ ๋ฐœ์ „๊ธฐ๋ž‘ ํ’€์ด ๋ฐฉ์‹์ด ๊ต‰์žฅํžˆ ์œ ์‚ฌํ•˜๋‹ค.

1. ์ƒํ•˜์ขŒ์šฐ๋กœ ๊ฐ™์€ ์•ŒํŒŒ๋ฒณ์ด ์žˆ์œผ๋ฉด ์ด๋™ํ•˜์—ฌ ๋‹ค์‹œ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ๋น„๊ตํ•œ๋‹ค.

2. 1์„ ๋” ์ด์ƒ ์ƒํ•˜์ขŒ์šฐ์— ๊ฐ™์€ ์•ŒํŒŒ๋ฒณ์ด ์•ˆ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.(DFS๋ฅผ ์‚ฌ์šฉ)

3. ์ด ๋ฐ˜๋ณต ํšŸ์ˆ˜ + 1(์ฒ˜์Œ ์ž๋ฆฌ)๊ฐ€ ์—ฐ๊ฒฐ ์š”์†Œ์˜ ๊ฐœ์ˆ˜์ด๋‹ค.

4. ์—ฐ๊ฒฐ ์š”์†Œ๋ฅผ ์ €์žฅํ•œ vector์˜ size๋ฅผ ํ™•์ธํ•˜์—ฌ k๊ฐœ ์ด์ƒ์ด๋ฉด ํ•ด๋‹นํ•˜๋Š” ์นธ์— ์•ŒํŒŒ๋ฒณ์„ ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•ด ์ค€๋‹ค.

5. 1~4๊นŒ์ง€์˜ ํ–‰์œ„๊ฐ€ ๋ฌธ์ œ ์„ค๋ช…์— ์žˆ๋Š” ์ž‘์—…์ด๋ฉฐ ์ด๋ฅผ q๋ฒˆ ๋ฐ˜๋ณตํ•˜๋ฉด ๋๋‚œ๋‹ค.

 

 

 

๋ฌธ์ œ ํ•ด๊ฒฐ

 

1. DFSํ•จ์ˆ˜์™€ ์—ฐ๊ฒฐ ์š”์†Œ๋ฅผ ์ €์žฅํ•  vector์ธ save๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์–ด ์—ฐ์‚ฐํ•œ๋‹ค.

    vector<vector<int>> visit(50, vector<int>(50, 0));
    stack<pair<int,int>> s;
    vector<pair<int, int>> save;
    s.push(make_pair(y,x));
    save.push_back(make_pair(y,x));
    visit[y][x] = 1;
    while(!s.empty()){
        int ty = s.top().first;
        int tx = s.top().second;
        s.pop();
        for (int i = 0; i < 4; i++) {
            int px = tx + dx[i];
            int py = ty + dy[i];
            if (px < 0 || px >= n || py < 0 || py >= n ) continue;
            if((visit[py][px] == 0) && (graph[py][px] == c)) {
                s.push(make_pair(py, px));
                save.push_back(make_pair(py, px));
                visit[py][px] = 1;
            }
        }
    }
    if (save.size() >= k) {
        for (int i = 0; i < save.size(); i++) {
            graph[save[i].first][save[i].second] = '.';
        }
    }

 

2. ์—ฐ๊ฒฐ ์š”์†Œ save์˜ ํฌ๊ธฐ๋ฅผ ํ™•์ธํ•˜์—ฌ k๊ฐœ ์ด์ƒ์ด๋ฉด ์ ์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค

    if (save.size() >= k) {
        for (int i = 0; i < save.size(); i++) {
            graph[save[i].first][save[i].second] = '.';
        }
    }

 

3.  1~2๋ฅผ q๋ฒˆ ๋ฐ˜๋ณตํ•ด ์ค€๋‹ค.

    for (int i = 0; i < q; i++) {
        cin >> y >> x >> c;
        y -= 1;
        x -= 1;
        graph[y][x] = c;
        visit[y][x] = 1;
        dfs(y, x, graph[y][x]);
        for (int j = 0; j < n; j++) {
            fill_n(visit[j], 50, 0);
        }
    }

 

 

๋ฌธ์ œ ํ›„๊ธฐ

์ฒ˜์Œ ์ฝ”๋“œ๋ฅผ ์งค ๋•Œ๋Š” ๋ชจ๋“  ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ํ™•์ธํ•ด ๋ณธ๋‹ค๊ณ  ํ•˜์—ฌ x, y, c๋ฅผ ์ž…๋ ฅ๋ฐ›์„ ๋•Œ๋งˆ๋‹ค ๋ชจ๋“  graph ์œ„์น˜๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉฐ ์ ์œผ๋กœ ๋งŒ๋“ค์–ด ์คฌ์—ˆ๋Š”๋ฐ, ์ƒ๊ฐํ•ด ๋ณด๋‹ˆ ์ฒ˜์Œ graph์—์„œ k๊ฐœ ์ด์ƒ์ธ ์—ฐ๊ฒฐ ์š”์†Œ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ƒฅ ์ž…๋ ฅ๋ฐ›์€ ์•ŒํŒŒ๋ฒณ์— ๋Œ€ํ•ด์„œ๋งŒ ์—ฐ์‚ฐํ•ด ์ฃผ์—ˆ์œผ๋ฉด ๋์—ˆ๋‹ค. 

 

์ด๋ ‡๊ฒŒ ๊ตฌ๋ฆ„ํ†ค ์ฑŒ๋ฆฐ์ง€๊ฐ€ ๋์ด ๋‚ฌ๋‹ค. ๋ฌธ์ œ๋“ค์ด ํฌ๊ฒŒ ์–ด๋ ต์ง€๋„ ์•Š์œผ๋ฉด์„œ, ๋˜๊ฒŒ ๊ทผ๋ณธ์ ์ธ ๊ธฐ๋ณธ๊ธฐ๋“ค์„ ๊ธฐ๋ฅผ ์ˆ˜ ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

ํ•˜๋ฃจ์”ฉ ๋Šฆ๊ฒŒ ์˜ฌ๋ฆฌ๋Š” ๋ฐ”๋žŒ์— ๋ธ”๋ก ๋ณด์ƒ๋„ ๋ช‡ ๊ฐœ ๋น ์ง€๊ณ  ์‹œ์ž‘ ์ž์ฒด๋„ 3์ผ ์ฐจ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ ํ„ฐ๋ผ, ๋ธ”๋ก๋“ค์„ ๋ชจ๋‘ ๋ชป์ฑ„์šด๊ฑด ์•„์‰ฝ๋‹ค.

์žฌ๋ฏธ์žˆ์—ˆ๊ณ , ํŠนํžˆ ๊ทธ๋ž˜ํ”„์—์„œ์˜ ๊ฐ ์ด๋ก ๋“ค์„ ํ™•์‹คํ•˜๊ฒŒ ๋ฐฐ์šฐ๊ณ  ์‘์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

์ „์ฒด ์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
char graph[50][50];
int n, k, q;
int dx[4] = {0,0,-1,1};
int dy[4] = {-1,1,0,0};

void dfs(int y, int x, char c){
    vector<vector<int>> visit(50, vector<int>(50, 0));
    stack<pair<int,int>> s;
    vector<pair<int, int>> save;
    s.push(make_pair(y,x));
    save.push_back(make_pair(y,x));
    visit[y][x] = 1;
    while(!s.empty()){
        int ty = s.top().first;
        int tx = s.top().second;
        s.pop();
        for (int i = 0; i < 4; i++) {
            int px = tx + dx[i];
            int py = ty + dy[i];
            if (px < 0 || px >= n || py < 0 || py >= n ) continue;
            if((visit[py][px] == 0) && (graph[py][px] == c)) {
                s.push(make_pair(py, px));
                save.push_back(make_pair(py, px));
                visit[py][px] = 1;
            }
        }
    }
    if (save.size() >= k) {
        for (int i = 0; i < save.size(); i++) {
            graph[save[i].first][save[i].second] = '.';
        }
    }
}

void pnt() {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
        {
            cout << graph[i][j];
        }
        cout << endl;
    }
}

int main(){
    cin >> n >> k >> q;
    for(int i = 0; i < n; i++){
        for (int j = 0; j < n; j++)
        {
            cin >> graph[i][j];
        }
    }
    int y, x;
    char c;
    for (int i = 0; i < q; i++) {
        cin >> y >> x >> c;
        y -= 1;
        x -= 1;
        graph[y][x] = c;
        dfs(y, x, graph[y][x]);
    }
    pnt();
}