


땅인 부분에서 dfs나 bfs를 수행해서 하나의 섬을 다 탐색하고
그때마다 섬의 개수를 하나씩 증가시켜주면 되는 어렵지 않은 문제였다.
import java.io.*; import java.util.*; public class Main { // 상하좌우, 대각선으로 이동하기 위한 좌표 static int[] dx = {0,0,-1,1,-1,-1,1,1}; static int[] dy = {1,-1,0,0,1,-1,1,-1}; // 지도와 해당 칸을 방문했는지 확인하기 위한 배열 static int[][] graph; static boolean[][] visit; // 섬의 개수 static int cnt = 0; static int W; static int H; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while(true) { StringTokenizer st = new StringTokenizer(br.readLine()," "); W = Integer.parseInt(st.nextToken()); H = Integer.parseInt(st.nextToken()); // 0 0이 입력되면 반복문 종료 if(W==0&&H==0) break; graph = new int[H][W]; visit = new boolean[H][W]; // 그래프 만들기 for(int i=0;i<H;i++) { st = new StringTokenizer(br.readLine()," "); for(int j=0;j<W;j++) { graph[i][j] = Integer.parseInt(st.nextToken()); } } for(int i=0;i<H;i++) { for(int j=0;j<W;j++) { // 1이고 아직 방문하지 않은 곳이면 dfs 수행 // dfs가 한 번 끝나면 하나의 섬을 탐색했다는 뜻이므로 // 섬의 개수를 +1 if(graph[i][j]==1&&!visit[i][j]) { dfs(i,j); cnt++; } } } System.out.println(cnt); cnt=0; } } public static void dfs(int x, int y) { visit[x][y] = true; for(int i=0;i<8;i++) { int nx = x+dx[i]; int ny = y+dy[i]; if(nx>=0&&ny>=0&&nx<H&&ny<W) { if(graph[nx][ny]==1&&!visit[nx][ny]) { dfs(nx,ny); } } } } }
좀 바보같은 이야기지만 이번 문제에서 제일 어려웠던 점은..ㅋㅋㅋ
if(nx>=0&&ny>=0&&nx<H&&ny<W) { if(graph[nx][ny]==1&&!visit[nx][ny]) { dfs(nx,ny); } }
nx<H&&ny<W 이 조건을 이해하는 것이었다.
H가 세로고 W가 가로니까
nx>W&&ny<H가 되어야 할 것 같은데, 이렇게 하면 에러가 나왔다.
그래서 다시 생각해봤다.
H = 2, W = 3인 상황이다.
내가 생각한..일반적인 좌표상에서의 x와 y값은 이렇다.
(0,1) | (1,1) | (2,1) |
(0,0) | (1,0) | (2,0) |
하지만 이 문제에서 나는 [2x3] 크기의 2차원 배열을 사용했고
그 배열의 인덱스는 이렇다.
(0,0) | (0,1) | (0,2) |
(1,0) | (1,1) | (1,2) |
딱 이렇게 그려보고나니 저 조건식이 이해가 됐다.
'Algorithm > [BOJ] - JAVA' 카테고리의 다른 글
[백준] 7569 : 토마토 JAVA 풀이 (1) | 2022.10.14 |
---|---|
[백준] 7576 : 토마토 JAVA 풀이 (0) | 2022.10.14 |
[백준] 2667 : 단지번호 붙이기 JAVA 풀이 (0) | 2022.10.13 |
[백준] 2331 : 반복수열 JAVA 풀이 (1) | 2022.10.13 |
[백준] 10451 : 순열 사이클 JAVA 풀이 (0) | 2022.10.12 |