๐Ÿ’ญ Problem Solving/C++

[BOJ][C++] ๋ฐฑ์ค€ 2667๋ฒˆ: ๋‹จ์ง€๋ฒˆํ˜ธ๋ถ™์ด๊ธฐ

0=2. 2024. 11. 11. 16:32

๋ฌธ์ œ

https://www.acmicpc.net/problem/2667

 

๋ฌธ์ œ ์ดํ•ด

  • N × N ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ์ง€๋„์—์„œ 1์€ ์ง‘์ด ์žˆ๋Š” ๊ณณ์„, 0์€ ์ง‘์ด ์—†๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • ์ง‘์ด ์žˆ๋Š” ๊ณณ(1)๋ผ๋ฆฌ ์ƒํ•˜์ขŒ์šฐ๋กœ ์—ฐ๊ฒฐ์‹œ์ผœ ๋‹จ์ง€๋ฅผ ๋งŒ๋“ ๋‹ค.
  • ์ด ๋‹จ์ง€์ˆ˜์™€ ๋‹จ์ง€๋‚ด ์ง‘์˜ ์ˆ˜๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

 

๋ฌธ์ œ ํ’€์ด

๐Ÿ” ์ ‘๊ทผ

์ง‘์ด ์กด์žฌํ•˜๋Š” ๊ณณ์„ ๊ธฐ์ค€์œผ๋กœ ๊ทธ ์ง‘์˜ ์ƒํ•˜์ขŒ์šฐ์— ๋˜ ๋‹ค๋ฅธ ์ง‘์ด ์กด์žฌํ•˜๋Š”์ง€๋ฅผ ํŒ๋‹จํ•˜๋Š” ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๋ฌธ์ œ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ง€๋„๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ '1'์ด ๋‚˜์™”์„ ๋•Œ ๋ชจ๋“  ์ธ์ ‘ ์ •์ ์„ ๋ฐฉ๋ฌธํ•˜์—ฌ ์—ฐ๊ฒฐ๋œ ์ง‘์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•œ๋‹ค.

 

๐Ÿ”จ ๊ตฌํ˜„

BFS์™€ DFS๋ฅผ ์ด์šฉํ•˜์—ฌ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

  • ๋ฐฉ๋ฌธ ํ‘œ๊ธฐ๋Š” visited ๋ฐฐ์—ด์„ ๋งŒ๋“œ๋Š” ๋Œ€์‹  ์ง€๋„์—์„œ ๋ฐฉ๋ฌธํ•œ ๊ณณ์„ '0'์œผ๋กœ ๋ฐ”๊พธ์–ด ํ‘œ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ง‘์ด ์žˆ๋Š” ๊ณณ์—์„œ dr, dc ๋ฐฐ์—ด์„ ์ด์šฉํ•ด์„œ ์ƒํ•˜์ขŒ์šฐ๋กœ ํƒ์ƒ‰ํ•œ๋‹ค.
  • ๋‹ค์Œ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ณณ์— ์ง‘์ด ์žˆ์œผ๋ฉด ํ˜„์žฌ ๋‹จ์ง€์˜ ์ง‘์˜ ๊ฐœ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
  • ์ง‘์ด ์—†๊ฑฐ๋‚˜ ๋ฐฉ๋ฌธํ•œ ๊ณณ(0)์ด๋ฉด ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ๊ณณ์œผ๋กœ, ํƒ์ƒ‰์„ ์ข…๋ฃŒํ•œ๋‹ค.
  • ํ•œ ๋‹จ์ง€์˜ ํƒ์ƒ‰์ด ๋๋‚˜๋ฉด ์ง‘์˜ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
  • ๋‹จ์ง€ ๋‚ด ์ง‘์˜ ์ˆ˜๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด ์ •๋ ฌ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

๐Ÿšจ  ํƒ์ƒ‰ ์‹œ ์ธ๋ฑ์Šค ์—๋Ÿฌ์— ์ฃผ์˜ํ•œ๋‹ค.

 

์ฝ”๋“œ

1๏ธโƒฃ BFS

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;
typedef pair<int, int> ci;

int bfs(int n, int r, int c, vector<vector<int>> &board) {
    int dr[4] = {-1, 1, 0, 0};
    int dc[4] = {0, 0, -1, 1};

    queue <ci> q;

    q.push({r, c});
    board[r][c] = 0;
    int cnt = 1;

    while (!q.empty()) {
        int cr = q.front().first;
        int cc = q.front().second;
        q.pop();

        for (int i = 0; i < 4; i++) {
            int nr = cr + dr[i];
            int nc = cc + dc[i];
            if (nr < 0 || nr >= n || nc < 0 || nc >= n || !board[nr][nc]) {
                continue;
            }
            q.push({nr, nc});
            board[nr][nc] = 0;
            cnt++;
        }
    }
    return cnt;

}

int main() {
    int n;
    string s;
    vector<int> ans;

    //์ž…๋ ฅ
    cin >> n;
    vector<vector<int>> board(n, vector<int>(n));
    for (int i = 0; i < n; i++) {
        cin >> s;
        for (int j = 0; j < n; j++) {
            board[i][j] = s[j] - '0';
        }
    }

    //์—ฐ์‚ฐ
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (board[i][j]) {
                ans.push_back(bfs(n, i, j, board));
            }
        }
    }

    //์ถœ๋ ฅ
    cout << ans.size() << '\n';
    sort(ans.begin(), ans.end());
    for (int i: ans)
        cout << i << '\n';

    return 0;
}

 

 

2๏ธโƒฃ DFS

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int n, cnt;
vector<vector<int>> board;
vector<int> ans;
int dr[4] = {-1, 1, 0, 0};
int dc[4] = {0, 0, -1, 1};

void dfs(int r, int c) {
    // ์ธ๋ฑ์Šค ์—๋Ÿฌ ๋ฐฉ์ง€
    // ์ข…๋ฃŒ ์กฐ๊ฑด: ์ง‘์ด ์—†๊ฑฐ๋‚˜ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๊ณณ
    if (r < 0 || r >= n || c < 0 || c >= n || !board[r][c]) {
        return;
    }

    cnt++;
    board[r][c] = 0;

    for (int i = 0; i < 4; i++) {
        dfs(r + dr[i], c + dc[i]);
    }
}

int main() {
    string s;

    //์ž…๋ ฅ
    cin >> n;
    board.assign(n, vector<int>(n));
    for (int i = 0; i < n; i++) {
        cin >> s;
        for (int j = 0; j < n; j++) {
            board[i][j] = s[j] - '0';
        }
    }

    //์—ฐ์‚ฐ
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (board[i][j]) {
                cnt = 0;
                dfs(i, j);
                ans.push_back(cnt);
            }
        }
    }

    //์ถœ๋ ฅ
    cout << ans.size() << '\n';
    sort(ans.begin(), ans.end());
    for (int i: ans)
        cout << i << '\n';

    return 0;
}