티스토리 뷰
2667번: 단지번호붙이기
<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여
www.acmicpc.net
다시 푼 문제, 이전 글 : tose33.tistory.com/26
동서남북 이동은 다음과 같이 처리
int dx[4] = {0, 1, 0, -1}; // n,e,s,w
int dy[4] = {-1, 0, 1, 0};
입력이 띄어쓰기 없이 쭉 주어져서 다음과 같이 처리
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
scanf("%1d", &apt[i][j]);
}
}
지금까지 푼 dfs, bfs 문제와 같지만 지금까지는 연결관계가 간선의 정보로 주어졌다면
이 문제는 배열에 주어짐. 따라서 직접 동서남북으로 이동해서 0인지 1인지 판단해야함.
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>
int N;
int aptnum = 0;
int group = 1;
int apt[26][26]; // 아파트 원본
int res[26][26]; // 그룹번호 찍힐 배열
int dx[4] = {0, 1, 0, -1}; // n,e,s,w
int dy[4] = {-1, 0, 1, 0};
vector<int> v;
void dfs(int x, int y) {
if(res[x][y] > 0 || apt[x][y] != 1) return;
res[x][y] = group;
aptnum++;
for(int i = 0; i < 4; i++) {
int nx = x + dx[i]; // n,e,s,w 이동
int ny = y + dy[i];
if(nx < 0 || nx > N || ny < 0 || ny > N) continue;
dfs(nx,ny);
}
}
int main() {
cin >> N;
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
scanf("%1d", &apt[i][j]);
}
}
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
if(apt[i][j] == 1 && res[i][j] == 0) { // 아파트가 있고, 방문하지 않은
dfs(i,j);
group++;
v.push_back(aptnum);
aptnum = 0;
}
}
}
cout << group - 1 << endl;
sort(v.begin(), v.end());
for(int x : v) cout << x << endl;
}
'PS' 카테고리의 다른 글
백준 2178. 미로 찾기 (0) | 2021.04.02 |
---|---|
백준 4963. 섬의 개수 (0) | 2021.04.01 |
백준 9466. 텀 프로젝트 (0) | 2021.03.30 |
백준 2331. 반복수열 (0) | 2021.03.29 |
백준 10451. 순열 사이클 (0) | 2021.03.26 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Kruskal
- priority queue
- Unity
- back tracking
- permutation
- db
- dfs
- Tree
- C
- BFS
- C++
- Python
- 자료구조
- Brute Force
- recursion
- Stack
- CSS
- floyd warshall
- binary search
- greedy
- 이분탐색
- DP
- MVC
- Implementation
- Dijkstra
- 재귀
- two pointer
- 조합
- Spring
- graph
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함