Softeer Lv2. 장애물 인식 프로그램
백준 2667 단지 번호 붙이기와 같은 문제
완전히 같은 문제이나, IDE를 사용하지 않고 풀이에 도전
주의점
- IDE를 사용하지 않으므로 디버깅이 힘들다
- 여기저기서 Printf를 통해 디버깅 시도
- BFS 함수 내에서 visited를 선언했더니, 초기화가 제대로 되지 않아 굉장히 헤맸음
- 출력시에는 0으로 잘 출력되어 문제가 없는줄 알았으나 일부 TC를 통과하지 못했음
- 결국 IDE에서 돌려보고나서 뭐가 문젠지 확인했음
- 줄입력으로 들어오므로, 이를 잘라서 int형으로 셀마다 저장해야함
3. 소스코드
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int N;
int map[26][26];
struct node{
int y;
int x;
};
int direct[4][2] = {0,-1,-1,0,0,1,1,0}; // 4방향
vector<int> result;
void PrintMap(){
cout << "============== Map ==============" <<endl;
for(int y=0; y<N; y++){
for(int x=0; x<N; x++){
cout << map[y][x];
}
cout << endl;
}
}
void BFS(int y, int x){
int visited[26][26] = {0};
queue<node> qu;
// 첫 노드 방문처리
visited[y][x] = 1;
map[y][x] = 0;
// 큐에 넣음
qu.push({y, x});
int size = 0;
while(!qu.empty()){
node now = qu.front();
qu.pop();
size++;
for(int t=0; t<4; t++){
int dy = direct[t][0] + now.y;
int dx = direct[t][1] + now.x;
if(dy < 0 || dx < 0 || dy >= N || dx >= N) continue;
if(map[dy][dx] == 0) continue; // 바다라면 패스
if(visited[dy][dx] == 1) continue; // 이미 방문 배열은 패스
visited[dy][dx] = 1;
map[dy][dx] = 0;
qu.push({dy, dx});
}
}
result.push_back(size);
}
int main(int argc, char** argv)
{
cin >> N;
for(int y=0; y<N; y++){
string tmp; cin >> tmp;
for(int x=0; x<tmp.size(); x++){
map[y][x] = tmp[x] - '0';
}
}
int cnt=0;
for(int y=0; y<N; y++){
for(int x=0; x<N; x++){
if(map[y][x] == 1){
BFS(y, x);
cnt++;
}
}
}
cout << cnt << endl;
// 오름차순으로 정렬
sort(result.begin(), result.end());
for(auto e : result){
cout << e << endl;
}
return 0;
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.