Baekjoon 2667 (단자번호 붙이기)

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
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>

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 아무거나 사용해도 상관없다.

Author

Yeonsang Shin

Posted on

2020-09-08

Updated on

2022-12-19

Licensed under

Comments