본문 바로가기
개인 공부/코딩테스트

[C++][백준 2667][BFS DFS] 단지번호 붙이기 :: seoftware

by seowit 2020. 2. 19.

 문제 

https://www.acmicpc.net/problem/2667

 

2667번: 단지번호붙이기

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집들의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여기서 연결되었다는 것은 어떤 집이 좌우, 혹은 아래위로 다른 집이 있는 경우를 말한다. 대각선상에 집이 있는 경우는 연결된 것이 아니다. <그림 2>는 <그림 1>을 단지별로 번호를 붙인 것이다. 지도를 입력하여 단지수를 출력하고, 각 단지에 속하는 집의 수

www.acmicpc.net

 소스 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int N;
int map[25][25] = {0};
bool visited[25][25];

int dx[] = {0, 1, 0, -1};//12시부터 시계방향
int dy[] = {-1, 0, 1, 0};

int bfs(int x, int y) {
	visited[x][y] = true;
	int count = 0;
	for (int i = 0; i < 4; i++) {
		int xx = x + dx[i];
		int yy = y + dy[i];

		if (xx >= 0 && yy >= 0 && xx < N && yy < N && map[xx][yy] == 1 && !visited[xx][yy]) {
			visited[xx][yy] = true;
			count++;
			count += bfs(xx, yy);
		}
	}
	return count;
}
int main(void) {
	cin >> N;

	//입력
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			scanf("%1d", &map[i][j]);
		}
	}

	//수행
	vector<int> answer;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			if (map[i][j] == 1 && !visited[i][j]) answer.push_back(bfs(i, j));
		}
	}

	//출력
	sort(answer.begin(), answer.end());
	int size = 0;
	size = answer.size();
	cout << answer.size() << endl;
	for (int v : answer) {
		cout << v+1 << endl;
	}
	return 0;
}

bfs 알고리즘으로 분리되어 있어서 bfs 로 풀려고 했는데 풀다보니 dfs 방법으로 풀었다.. ㅋㅋㅋ 그래서 처음 그대로 함수 이름은 bfs.... 

bfs 함수 내부에서 xx와 yy의 범위를 0과 N 사이로 안 잡아줘서 계속 "틀렸습니다!"가 나왔었다. 이런 실수 하지 마세유 제발 뭘 틀렸는지 어느 부분에서 틀렸는지 어떤 케이스에서 오류가 나는지 알려줬음 좋겠다ㅜㅜ

 

아 이 코드에서 중요한건 dx와 dy 배열로 for문 돌려서 주변 확인하는 것!!

댓글