프로그래밍 공부/백준 (C++)
[C++ / 백준 2667번] 단지번호 붙이기
Rocketbabydolls
2025. 2. 26. 12:37
문제
시행 착오
없음
해결 방법
순회하며 1을 찾고, 1을 찾은 위치에서 DFS 를 이용해 상하, 좌우에 1이 없을 때까지 탐색했다.
아래는 문제풀이 전에 직접 VS 에 작성한 방법이다.
DP 를 풀듯 차근차근 생각하는 것이 도움이 많이 되는 것 같다.
생각해 본 해결방법
1. 상하, 좌우 이렇게 두 경우만 집이 붙어있는 경우이다.
2. DFS / BFS 중 어느거라도 사용한다.
3. 몇 개가 붙어있는지 세고 오름차순으로 출력한다.
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> v;
int N;
int map[26][26];
bool visited[26][26] = { false };
int cnt = 0;
void DFS(int curY, int curX)
{
if ( curY < 0 || curX < 0 || curY >= N || curX >= N || visited[curY][curX] ) return;
cnt += 1;
visited[curY][curX] = true;
if (!visited[curY+1][curX] && map[curY+1][curX] == 1)
{
DFS(curY + 1, curX);
}
if (!visited[curY][curX+1] && map[curY][curX+1] == 1)
{
DFS(curY, curX + 1);
}
if (!visited[curY][curX-1] && map[curY][curX-1] == 1)
{
DFS(curY , curX - 1);
}
if (!visited[curY-1][curX] && map[curY-1][curX] == 1)
{
DFS(curY - 1, curX);
}
}
int main() {
/*
* 생각해 본 해결방법
*
* 1. 상하, 좌우 이렇게 두 경우만 집이 붙어있는 경우이다.
* 2. DFS / BFS 중 어느거라도 사용한다.
* 3. 몇 개가 붙어있는지 세고 오름차순으로 출력한다.
*/
cin >> N;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
scanf("%1d", &map[i][j]);
}
}
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
cnt = 0;
if (!visited[i][j] && map[i][j] == 1)
{
DFS(i, j);
v.push_back(cnt);
}
}
}
sort(v.begin(), v.end());
cout << v.size() << '\n';
for (auto i : v)
{
cout << i << '\n';
}
return 0;
}