โท ๋ฌธ์ ์ค๋ช
์ง์ด ์๋ ๊ณณ์ 1, ์ง์ด ์๋ ๊ณณ์ 0์ผ๋ก ํํ๋ ์ง๋์ ๋ณด(์ ์ฌ๊ฐํ)๋ฅผ ์ฃผ๊ณ ,
๋จ์ง์ ์์ ๊ฐ ๋จ์ง ๋ด ์ง์ ์๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ถ๋ ฅํ๋ ๋ฌธ์
์กฐ๊ฑด) ์ฐ๊ฒฐ๋ ์ง๋ค์ ์ํ์ข์ฐ์ ์๋ ์ง์ด๋ค. ๋๊ฐ์ X.
์ง๋์ ํฌ๊ธฐ N์ 5<=N<=25 ๋ฒ์์ ์์ด๋ค.
โท ๋ฌธ์ ํ์ด
[ ๋ณ์์ ์ ]
๋ฌธ์ ์์ ์ง๋ ์ ๋ณด๋ฅผ N*Nํฌ๊ธฐ๋ก ์คฌ์ผ๋ฏ๋ก ๋ฐฐ์ด์ ์ด์ฉํด์ ์ ๋ ฅ ๋ฐ์๊ณ , ๋ฐฉ๋ฌธ ๋ฐฐ์ด ๋ํ ๋ฐฐ์ด๋ก ํํํ๋ค.
ํด๋น ์ง์ ์์ ์ํ์ข์ฐ๋ฅผ ํ์ํ๊ธฐ ์ํ ๋ณ์๋ก direction[4][2] ๋ณ์๋ฅผ ๋ง๋ค์๋ค.
[ ์๊ณ ๋ฆฌ์ฆ - DFS์ด์ฉ ]
1) ์ง๋์ ๋ณด๋ scanf๋ก ๊ณต๋ฐฑ์๋ ์ซ์๋ฅผ ํ์ค์ฉ ์ ๋ ฅ๋ฐ๋๋ค. scanf_s("%1d", &map[i][j])
2) ์ง๋์ (0, 0) ์ขํ๋ถํฐ ์ง์ด ์๋ ์๋ฆฌ์ด๊ณ ๋ฐฉ๋ฌธํ ์ ์๋ ๊ณณ์ด๋ฉด ์ง์ ํ์ํ๊ธฐ ์์ํ๋ค.
3) ํ์ฌ ์์น(0, 0)์์ ์ํ์ข์ฐ๋ฅผ ์ดํด๋ณธ๋ค. ์ํ์ข์ฐ(๋ฐ๋ณต๋ฌธ์ผ๋ก ์ด 4๋ฒ)๋ฅผ ํ์ํ ๋ ์ง๋์ ๋ฒ์๋ฅผ ๋์ง ์๋ ๊ฒฝ์ฐ๋ง ํ์ํ๋ค.
if (dx >= 0 && dx < map_size && dy >= 0 && dy < map_size)
4) ํ์ํ ๋๋ง๋ค ํ์ฌ ์์น๋ฅผ ๋ฐฉ๋ฌธํ๋ค๊ณ ํ์ํด์ฃผ๊ณ (visited[x][y] = 1) ๋จ์ง๋ด ์ง์ ์๋ฅผ ๋๋ ค์ค๋ค(houseNum++).
5) ์ด๋ํ ์ or ํ or ์ข or ์ฐ ์ขํ ์์น๊ฐ ์ง์ด ์๋๊ฑฐ๋ ๋ฐฉ๋ฌธํ์ ์ด ์์ ๋๊น์ง ๊น์ด ํ์ํ๋ค. SearchHouse(dx, dy)
6) ์ง์ด ์๋๊ฑฐ๋ ๋ฐฉ๋ฌธํ์ ์ด ์์ผ๋ฉด returnํ๋ค.(์ด์ ๋จ๊ณ๋ก ๋์๊ฐ) if (map[x][y] == 0 || visited[x][y])
7) ๋์์์ ๋จ์ง๋ด ์ง์ ์๋ฅผ ๊ด๋ฆฌํ๋ ๋ฒกํฐ๋ฐฐ์ด(vector<int> houseGroup)์ ๋ฃ์ด์ค๋ค.
7) ์ฐ๊ฒฐ๋ ๋จ์ง ๋ด์์ DFS๋ก ๋ชจ๋ ํ์ํ์ผ๋ฉด ๋จ์ง์ ์๋ฅผ 1 ๋๋ ค์ค๋ค. houseGroupNum++
8) ๋ง์ง๋ง ์ง๋ ์ขํ๊น์ง ํ์์ ํ๋ฉด ๋จ์ง ์์ ๊ฐ ๋จ์ง๋ด ์ง์ ์๋ฅผ ์ค๋ฆ์ฐจ์(sort() ํจ์ ์ด์ฉ)์ผ๋ก ์ถ๋ ฅํ๋ค.
โท ์๊ฐ๋ณต์ก๋
์ง๋ ํฌ๊ธฐ๋งํผ 2์ค ๋ฐ๋ณต๋ฌธ์ ๋๋ฆฌ๊ณ , ๊ฐ ์๋ฆฌ๋ง๋ค 4๋ฒ์ฉ ํ์ํ๋ฏ๋ก O(4N²) = O(N²)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค.
โท ์ฝ๋
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MAX = 26;
void SearchHouse(int, int);
int map[MAX][MAX];
bool visited[MAX][MAX];
int map_size;
int direction[4][2] = { {0,-1}, {1,0}, {-1,0}, {0,1}, }; //์ํ์ข์ฐ
int houseGroupNum; //๋จ์ง์
int houseNum; //๋จ์ง๋ด์ ์ง ์
int main() {
//Input
cin >> map_size;
for (int i = 0; i < map_size; i++) {
for (int j = 0; j < map_size; j++) {
scanf_s("%1d", &map[i][j]); // ๊ณต๋ฐฑ์๋ ์ซ์๋ฅผ ํ์ค์ฉ ์
๋ ฅ๋ฐ๋ ๋ฒ
}
}
//Search
vector<int> houseGroup;
for (int i = 0; i < map_size; i++) {
for (int j = 0; j < map_size; j++) {
if (map[i][j] == 1 && !visited[i][j]) {
SearchHouse(i,j);
houseGroup.push_back(houseNum);
houseGroupNum++;
houseNum = 0;
}
}
}
//Output
cout << houseGroupNum << "\n";
sort(houseGroup.begin(), houseGroup.end());
for (int i = 0; i < houseGroup.size(); i++) {
cout << houseGroup[i] << "\n";
}
}
void SearchHouse(int x, int y) {
if (map[x][y] == 0 || visited[x][y]) {
return;
}
visited[x][y] = 1;
houseNum++;
for (int i = 0; i < 4; i++) {
int dx = x + direction[i][0];
int dy = y + direction[i][1];
if (dx >= 0 && dx < map_size && dy >= 0 && dy < map_size) {
SearchHouse(dx, dy);
}
}
}
'๐ Coding Test Study > Algorithm Problem' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon][C++] 4963๋ฒ ์ฌ์ ๊ฐ์ ๋ฌธ์ ์ค๋ช ๋ฐ ์ฝ๋ (0) | 2021.04.17 |
---|---|
[Baekjoon][C++] 1759๋ฒ ์ํธ ๋ง๋ค๊ธฐ ๋ฌธ์ ์ค๋ช ๋ฐ ์ฝ๋ (0) | 2021.04.17 |
[Baekjoon][C++] 9095๋ฒ 1, 2, 3 ๋ํ๊ธฐ ๋ฌธ์ ์ค๋ช ๋ฐ ์ฝ๋ (0) | 2021.03.07 |
[Baekjoon][C++] 14500๋ฒ ํ ํธ๋ก๋ฏธ๋ ธ ๋ฌธ์ ์ค๋ช ๋ฐ ์ฝ๋ (0) | 2021.03.06 |
[Baekjoon][C++] 1476๋ฒ ๋ ์ง๊ณ์ฐ ๋ฌธ์ ์ค๋ช ๋ฐ ์ฝ๋ (0) | 2021.03.03 |