Algorithm/BOJ
[BOJ 4963] 섬의 개수 C++
surimi🍥
2023. 2. 9. 11:14
반응형
섬의 개수
난이도: Silver 2
번호: 4963
사용 함수, 자료 구조: memset
알고리즘 분류: 그래프 이론, 그래프 탐색, 깊이 우선 탐색, 너비 우선 탐색
언어: C++
C++
상하좌우와 대각선 방향까지 8방 탐색을 할 수 있도록 방향배열(dX, dY)을 설정해준다.
const int dX[] = {1, -1, 0, 0, 1, 1, -1, -1}; const int dY[] = {0, 0, -1, 1, 1, -1, 1, -1};
8방 탐색중에 Out of Bound가 발생할수 있는데 해결에는 2가지 방법이 있다.
if 조건 추가
if (i < 0 || j < 0 || i >= M || j >= N) continue;
그래프 배열 상하좌우에 1칸씩 여유공간을 만들어준다.
- 이 문제에서는
1 ≤ W, H ≤ 50
이란 조건이 있으므로 노드를 담는 배열에 0 ~ 51 인덱스까지 공간을 할당해주면 탐색중 1~50 테두리 밖(0, 51)으로 나가더라도 에러가 발생하지 않는다.
- 이 문제에서는
#include <iostream>
#include <cstring>
using namespace std;
const int dX[] = {1, -1, 0, 0, 1, 1, -1, -1};
const int dY[] = {0, 0, -1, 1, 1, -1, 1, -1};
bool node[52][52];
int cnt;
void reset()
{
cnt = 0;
memset(node, 0, sizeof(node));
}
void DFS(int i, int j)
{
node[i][j] = false;
for (int k = 0; k < 8; k++)
{
int x = j + dX[k];
int y = i + dY[k];
if (node[y][x])
DFS(y, x);
}
}
int main(void)
{
cin.tie(0)->sync_with_stdio(0);
cout.tie(0);
while (1)
{
int W, H;
cin >> W >> H;
if (W + H == 0)
return (0);
reset();
for (int i = 0; i < H; i++)
for (int j = 0; j < W; j++)
{
int n;
cin >> n;
if (n == 1)
node[i + 1][j + 1] = true;
}
for (int i = 1; i <= H; i++)
for (int j = 1; j <= W; j++)
{
if (node[i][j] == true)
{
cnt++;
DFS(i, j);
}
}
cout << cnt << '\n';
}
}
반응형