๋ฌธ์
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;
}
'๐ญ Problem Solving > C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][C++] ๋ฐฑ์ค 3085๋ฒ: ์ฌํ ๊ฒ์ (0) | 2024.10.30 |
---|---|
[BOJ][C++] ๋ฐฑ์ค 1789๋ฒ: ์๋ค์ ํฉ (0) | 2024.10.29 |
[BOJ][C++] ๋ฐฑ์ค 15650๋ฒ: N๊ณผ M (2) (0) | 2024.10.28 |
[BOJ][C++] ๋ฐฑ์ค 15649๋ฒ: N๊ณผ M (1) (0) | 2024.10.28 |
[SWEA][C++] 1289. ์์ฌ์ ๋ฉ๋ชจ๋ฆฌ ๋ณต๊ตฌํ๊ธฐ (0) | 2024.10.16 |