Baekjoon 2667 (단자번호 붙이기)
Baekjoon 2667, 백준 2667 문제의 본인 풀이입니다!
문제는 아래의 링크에서 확인할 수 있습니다.
문제보기1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using namespace std;
int map[27][27];
int visit[27][27];
int N, cnt = 0;
vector<int> v;
void dfs(int x, int y){
// visited V
visit[x][y] = 1;
cnt++;
// find next node
if(visit[x+1][y] != 1 && map[x+1][y] == 1 && x+1 < N) {
dfs(x+1, y);
}
if(visit[x][y+1] != 1 && map[x][y+1] == 1 && y+1 < N) {
dfs(x, y+1);
}
if(visit[x-1][y] != 1 && map[x-1][y] == 1 && x-1 >= 0) {
dfs(x-1, y);
}
if(visit[x][y-1] != 1 && map[x][y-1] == 1 && y-1 >= 0) {
dfs(x, y-1);
}
// when no deeper node exist, return (recursion)
}
int main() {
// put inputs
scanf("%d", &N);
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
scanf("%1d", &map[i][j]);
}
}
// initialization
memset(visit, 0, sizeof(visit));
// dfs
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
if(map[i][j] == 1 && visit[i][j] != 1) {
dfs(i, j);
v.push_back(cnt);
cnt = 0;
}
}
}
// print answer
sort(v.begin(), v.end());
printf("%d\n", v.size());
for(auto iter = v.begin(); iter != v.end(); iter++) {
printf("%d\n", *iter);
}
}
2차원 배열에서 그래프 탐색을 이용하여 푸는 문제이다.
DFS, BFS 아무거나 사용해도 상관없다.
Baekjoon 2667 (단자번호 붙이기)
http://yxxshin.github.io/2020/09/08/2020-09-08-Baekjoon-2667/