PS
[백준] 4863번 섬의 개수 (C++)
-minari-
2025. 1. 12. 22:03
https://www.acmicpc.net/problem/4963
문제 설명
각 테스트 케이스마다 w와 h가 주어진다.
w * h 크기의 배열이 주어지는데, 1은 땅을, 0은 바다를 의미한다.
땅은 가로, 세로, 대각선으로 움직일 수 있다. 각 테스트 케이스별로 연결된 땅의 개수를 구하는 문제이다.
마지막 테스트 케이스이라면 w와 h값으로 0이 주어진다
주요 로직
1. 그래프 탐색 문제이다
각 테스트 케이스마다 visited배열을 0으로 초기화하고 깊이 우선 탐색으로 배열을 탐색한다
정답 코드
#include <bits/stdc++.h>
using namespace std;
int w,h, arr[55][55], visited[55][55];
int dy[8] = {-1,-1,0,1,1,1,0,-1}, dx[8] = {0,1,1,1,0,-1,-1,-1};
void dfs(int y, int x){
visited[y][x] = 1;
for(int i=0; i<8; i++){
int ny = y + dy[i];
int nx = x + dx[i];
if(ny < 0 || ny >= h || nx < 0 || nx >= w) continue;
if(visited[ny][nx] || arr[ny][nx] == 0) continue;
dfs(ny,nx);
}
return ;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
while(cin >> w >> h){
fill(&arr[0][0], &arr[0][0]+55*55, 0);
fill(&visited[0][0], &visited[0][0]+55*55, 0);
if(w == 0 && h == 0) return 0;
for(int i=0; i<h; i++){
for(int j=0; j<w; j++){
cin >> arr[i][j];
}
}
int cnt = 0;
for(int i=0; i<h; i++){
for(int j=0; j<w; j++){
if(visited[i][j]) continue;
if(arr[i][j] == 0) continue;
cnt++;
dfs(i,j);
}
}
cout << cnt << "\n";
}
return 0;
}