• toc {:toc}

๋ฌธ์ œ

์ฐจ์„ธ๋Œ€ ์˜๋†์ธ ํ•œ๋‚˜๋Š” ๊ฐ•์›๋„ ๊ณ ๋žญ์ง€์—์„œ ์œ ๊ธฐ๋† ๋ฐฐ์ถ”๋ฅผ ์žฌ๋ฐฐํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค.๋†์•ฝ์„ ์“ฐ์ง€ ์•Š๊ณ ย ๋ฐฐ์ถ”๋ฅผ ์žฌ๋ฐฐํ•˜๋ ค๋ฉด ๋ฐฐ์ถ”๋ฅผ ํ•ด์ถฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ•œ๋‚˜๋Š” ํ•ด์ถฉ ๋ฐฉ์ง€์—ย ํšจ๊ณผ์ ์ธ ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด๋ฅผ ๊ตฌ์ž…ํ•˜๊ธฐ๋กœ ๊ฒฐ์‹ฌํ•œ๋‹ค. ์ด ์ง€๋ ์ด๋Š” ๋ฐฐ์ถ”๊ทผ์ฒ˜์— ์„œ์‹ํ•˜๋ฉฐ ํ•ด์ถฉ์„ ์žก์•„ย ๋จน์Œ์œผ๋กœ์จ ๋ฐฐ์ถ”๋ฅผ ๋ณดํ˜ธํ•œ๋‹ค. ํŠนํžˆ, ์–ด๋–ค ๋ฐฐ์ถ”์— ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด๊ฐ€ ํ•œ ๋งˆ๋ฆฌ๋ผ๋„ ์‚ด๊ณ  ์žˆ์œผ๋ฉด ์ด ์ง€๋ ์ด๋Š” ์ธ์ ‘ํ•œ ๋‹ค๋ฅธ ๋ฐฐ์ถ”๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์–ด, ๊ทธ ๋ฐฐ์ถ”๋“ค ์—ญ์‹œ ํ•ด์ถฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ํ•œ ๋ฐฐ์ถ”์˜ ์ƒํ•˜์ขŒ์šฐ ๋„ค ๋ฐฉํ–ฅ์— ๋‹ค๋ฅธ ๋ฐฐ์ถ”๊ฐ€ ์œ„์น˜ํ•œ ๊ฒฝ์šฐ์— ์„œ๋กœ ์ธ์ ‘ํ•ด์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

ํ•œ๋‚˜๊ฐ€ ๋ฐฐ์ถ”๋ฅผ ์žฌ๋ฐฐํ•˜๋Š” ๋•…์€ ๊ณ ๋ฅด์ง€ ๋ชปํ•ด์„œ ๋ฐฐ์ถ”๋ฅผ ๊ตฐ๋ฐ๊ตฐ๋ฐ ์‹ฌ์–ด ๋†“์•˜๋‹ค. ๋ฐฐ์ถ”๋“ค์ด ๋ชจ์—ฌ์žˆ๋Š” ๊ณณ์—๋Š” ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด๊ฐ€ ํ•œ ๋งˆ๋ฆฌ๋งŒ ์žˆ์œผ๋ฉด ๋˜๋ฏ€๋กœ ์„œ๋กœ ์ธ์ ‘ํ•ด์žˆ๋Š” ๋ฐฐ์ถ”๋“ค์ด ๋ช‡ ๊ตฐ๋ฐ์— ํผ์ ธ์žˆ๋Š”์ง€ ์กฐ์‚ฌํ•˜๋ฉด ์ด ๋ช‡ ๋งˆ๋ฆฌ์˜ ์ง€๋ ์ด๊ฐ€ ํ•„์š”ํ•œ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฐ์ถ”๋ฐญ์ด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉด ์ตœ์†Œ 5๋งˆ๋ฆฌ์˜ ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. 0์€ ๋ฐฐ์ถ”๊ฐ€ ์‹ฌ์–ด์ ธ ์žˆ์ง€ ์•Š์€ ๋•…์ด๊ณ , 1์€ ๋ฐฐ์ถ”๊ฐ€ ์‹ฌ์–ด์ ธ ์žˆ๋Š” ๋•…์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์ž…๋ ฅ

์ž…๋ ฅ์˜ ์ฒซ ์ค„์—๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ทธ ๋‹ค์Œ ์ค„๋ถ€ํ„ฐ ๊ฐ๊ฐ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด ์ฒซ์งธ ์ค„์—๋Š” ๋ฐฐ์ถ”๋ฅผ ์‹ฌ์€ ๋ฐฐ์ถ”๋ฐญ์˜ ๊ฐ€๋กœ๊ธธ์ด M(1 โ‰ค M โ‰ค 50)๊ณผ ์„ธ๋กœ๊ธธ์ด N(1 โ‰ค N โ‰ค 50), ๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์ถ”๊ฐ€ ์‹ฌ์–ด์ ธ ์žˆ๋Š” ์œ„์น˜์˜ ๊ฐœ์ˆ˜ K(1 โ‰ค K โ‰ค 2500)์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ ๋‹ค์Œ K์ค„์—๋Š” ๋ฐฐ์ถ”์˜ ์œ„์น˜ X(0 โ‰ค X โ‰ค M-1), Y(0 โ‰ค Y โ‰ค N-1)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘ ๋ฐฐ์ถ”์˜ ์œ„์น˜๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

์ถœ๋ ฅ

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด ํ•„์š”ํ•œ ์ตœ์†Œ์˜ ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด ๋งˆ๋ฆฌ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์ถœ์ฒ˜:https://www.acmicpc.net/problem/1012

ํ’€์ด

๋‹ค ํ’€์—ˆ๋Š”๋ฐโ€ฆ. boardํŒ์€ ์ดˆ๊ธฐํ™”ํ•ด๋†“๊ณ  visํŒ์˜ ์ดˆ๊ธฐํ™”๋ฅผ ์ƒ๊ฐ๋ชปํ–ˆ๋‹ค.

BFS ํ’€์ด ๊ทธ๋Œ€๋กœ ํ’€์ดํ•˜๋ฉด ๋œ๋‹ค. ๊ฒฐ๊ตญ ๋ณ€ํ™”ํ•˜๋Š” ๊ฒƒ์€ ์กฐ๊ฑด์‹ ๋ฟ์ด๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ฑด์‹๋งŒ ์ฃผ์˜ํ•ด์„œ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค.

2022-07-31 ํ’€์ด

#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
 
int m, n, k;
int dx[4] = {0, -1, 0, 1};
int dy[4] = {-1, 0, 1, 0};
 
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T;
    cin >> T;
    while(T--){
        int board[55][55] = {};     // ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์—
        int vis[55][55] = {};       // ๊ผญ ์ดˆ๊ธฐํ™”๋ฅผ ํ•ด์ค˜์•ผ ํ•จ.
        cin >> m >> n >> k;
        while(k--){                 // ๋ฐฐ์ถ”๊ฐ€ ์žˆ๋Š” ๊ณณ ํ‘œ์‹œ
            int x, y;
            cin >> x >> y;
            board[y][x] = 1;
        }
        
        /*
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                cout << board[i][j];
            }
            cout << endl;
        }
        */
 
        queue<pair<int, int>> q;
        int ans = 0;                // BFS ๋Œ๋ฆฌ๊ธฐ
        for(int row=0; row<n; row++){
            for(int col=0; col<m; col++){
                if(vis[row][col] == 0 && board[row][col] == 1){
                    vis[row][col] = 1;
                    q.push({row, col});
                    ans++;
                }
                while(!q.empty()){
                    auto cur = q.front(); q.pop();
                    for(int dir = 0; dir < 4; dir++){
                        int nx = cur.X + dx[dir];
                        int ny = cur.Y + dy[dir];
                        if(nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
                        if(vis[nx][ny] != 0 || board[nx][ny] != 1) continue;
                        vis[nx][ny] = 1;
                        q.push({nx, ny});
                    }
                }
            }
        }
 
        cout << ans << endl;
    }
}

2023-09-06 ํ’€์ด

์ƒˆ๋กญ๊ฒŒ ๋‹ค์‹œ ํ’€์–ด๋ดค๋Š”๋ฐ, ๋กœ์ง์˜ ๋ณ€ํ™”๋Š” ์—†๋‹ค.
1๋กœ ์ด๋ฃจ์–ด์ง„ ์˜์—ญ์ด ๋ช‡ ๊ฐœ ์ธ์ง€ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์— 1์ธ ๋ถ€๋ถ„์„ ์ฒ˜์Œ ๋“ค์–ด๊ฐˆ ๋•Œ ์˜์—ญ ์ฒดํฌ๋ฅผ ํ•ด์ฃผ๊ณ  BFS๋ฅผ ์ด์šฉํ•ด ์—ฐ๊ฒฐ๋œ ์˜์—ญ์„ -1๋กœ ์—†์• ์ค€๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ „๋ถ€ ์ฐพ์œผ๋ฉด ๋ช‡ ๋งˆ๋ฆฌ์˜ ๋ฐฐ์ถ”ํฐ์ง€๋ ์ด๊ฐ€ ํ•„์š”ํ•œ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
 
int dx[4] = {0, 0, -1, 1};
int dy[4] = {-1, 1, 0, 0};
int T, M, N, K;
queue<pair<int, int>> q;
 
 
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
 
    cin >> T;
 
    while(T--){
        int board[55][55] = {0,};
        cin >> M >> N >> K;
        for(int i = 0; i < K; i++){
            int x, y;
            cin >> x >> y;
            board[x][y] = 1;
        }
 
        int res = 0;
 
        for(int i = 0; i < M; i++){
            for(int j = 0; j < N; j++){
                if(board[i][j] == 0 || board[i][j] == -1) continue;
                q.push({i, j});
                board[i][j] = -1;
                res++;
                while(!q.empty()){
                    auto cur = q.front(); q.pop();
                    for(int dir = 0; dir < 4; dir++){
                        int nx = cur.X + dx[dir];
                        int ny = cur.Y + dy[dir];
                        if(nx < 0 || nx >= M || ny < 0 || ny >= N) continue;
                        if(board[nx][ny] == 0 || board[nx][ny] == -1) continue;
                        q.push({nx, ny});
                        board[nx][ny] = -1;
                    }
                }
            }
        }
        cout << res << '\n';
    }
    
    return 0;
}