01-09 18:44
Recent Posts
Recent Comments
관리 메뉴

miinsun

[BAEKJOON] λ°±μ€€ κ·Έλž˜ν”„ 4963 :: μ„¬μ˜ 개수 λ³Έλ¬Έ

Algorithm/Baekjoon

[BAEKJOON] λ°±μ€€ κ·Έλž˜ν”„ 4963 :: μ„¬μ˜ 개수

miinsun 2022. 4. 2. 23:42

πŸ’¬  문제 μ„€λͺ…

μ •μ‚¬κ°ν˜•μœΌλ‘œ 이루어져 μžˆλŠ” 섬과 λ°”λ‹€ 지도가 주어진닀. μ„¬μ˜ 개수λ₯Ό μ„ΈλŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

ν•œ μ •μ‚¬κ°ν˜•κ³Ό κ°€λ‘œ, μ„Έλ‘œ λ˜λŠ” λŒ€κ°μ„ μœΌλ‘œ μ—°κ²°λ˜μ–΄ μžˆλŠ” μ‚¬κ°ν˜•μ€ κ±Έμ–΄κ°ˆ 수 μžˆλŠ” μ‚¬κ°ν˜•μ΄λ‹€. 
두 μ •μ‚¬κ°ν˜•μ΄ 같은 섬에 있으렀면, ν•œ μ •μ‚¬κ°ν˜•μ—μ„œ λ‹€λ₯Έ μ •μ‚¬κ°ν˜•μœΌλ‘œ κ±Έμ–΄μ„œ 갈 수 μžˆλŠ” κ²½λ‘œκ°€ μžˆμ–΄μ•Ό ν•œλ‹€.

μ§€λ„λŠ” λ°”λ‹€λ‘œ λ‘˜λŸ¬μ‹Έμ—¬ 있으며, 지도 λ°–μœΌλ‘œ λ‚˜κ°ˆ 수 μ—†λ‹€.

 

πŸ”¨  μž…μΆœλ ₯ 예

μž…λ ₯ 

  • μž…λ ₯은 μ—¬λŸ¬ 개의 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ‘œ 이루어져 μžˆλ‹€.
  • 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 첫째 μ€„μ—λŠ” μ§€λ„μ˜ λ„ˆλΉ„ w와 높이 hκ°€ 주어진닀.
  • w와 hλŠ” 50보닀 μž‘κ±°λ‚˜ 같은 μ–‘μ˜ μ •μˆ˜μ΄λ‹€.
  • λ‘˜μ§Έ 쀄뢀터 h개 μ€„μ—λŠ” 지도가 주어진닀. 1은 λ•…, 0은 바닀이닀.
  • μž…λ ₯의 λ§ˆμ§€λ§‰ μ€„μ—λŠ” 0이 두 개 주어진닀.

 

좜λ ₯

  • 각 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄μ„œ, μ„¬μ˜ 개수λ₯Ό 좜λ ₯ν•œλ‹€.

 

예제 μž…λ ₯ 1)

1 1
0
2 2
0 1
1 0
3 2
1 1 1
1 1 1
5 4
1 0 1 0 0
1 0 0 0 0
1 0 1 0 1
1 0 0 1 0
5 4
1 1 1 0 1
1 0 1 0 1
1 0 1 0 1
1 0 1 1 1
5 5
1 0 1 0 1
0 0 0 0 0
1 0 1 0 1
0 0 0 0 0
1 0 1 0 1
0 0

 

예제 좜λ ₯ 1)

0
1
1
3
1
9

 

​

πŸ’»  Main.java

  • DFSλ₯Ό μ΄μš©ν•œ 풀이
  • 0,0 을 λ°›μœΌλ©΄ μ’…λ£Œν•˜λŠ” 반볡문
  • λŒ€κ°μ„  λ°©ν–₯κΉŒμ§€ μƒκ°ν•΄μ„œ λ²”μœ„ 검사λ₯Ό ν•΄μ£Όμž
/* λ°±μ€€ κ·Έλž˜ν”„ - 4963 :: μ„¬μ˜ 개수 */
import java.io.*;
import java.util.*;

public class Main {

	// μ•ž λ’€ μ–‘μ˜† λŒ€κ°μ„  μ’Œν‘œ 정보 
	static int[] dx = {0, 1, 1, 1, 0, -1, -1, -1}; 
	static int[] dy = {1, 1, 0, -1, -1, -1, 0, 1};

	static void DFS(int x, int y, int h, int w, int[][] map) {
		map[x][y] = 0;
	
		for(int i = 0; i < 8; i++) { 
			// λ‹€μŒμ— 올 μ’Œν‘œ
			int nx = x + dx[i]; 
			int ny = y + dy[i]; 
			
			// μ§€ν‘œ 경계 κ°’ 검사 and 단지 확인
			if(nx >= 0 && ny >= 0 && nx < h && ny < w && map[nx][ny] == 1) { 
				DFS(nx, ny, h, w, map); 
			}
		}
	}
	
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
	
		while(true) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			int w = Integer.parseInt(st.nextToken());
			int h = Integer.parseInt(st.nextToken());
			
			// w,hκ°€ 0이면 μ’…λ£Œ
			if(w == 0 && h == 0)
				break;
			
			// 맡 정보 μž…λ ₯
			int[][] map = new int[h][w];
			for(int i = 0; i < h; i++) {
				st = new StringTokenizer(br.readLine());
				for(int j = 0; j < w; j++) {
					map[i][j] = Integer.parseInt(st.nextToken());
				}
			}
			
			// λ•…μΌλ•Œλ§Œ DFSμ§„μž…
			int cnt = 0;
			for(int i = 0; i < h; i++) {
				for(int j = 0; j < w; j++) {
					if(map[i][j] == 1) {
						cnt++;
						DFS(i, j, h, w,map);
					}
				}
			}
			
			sb.append(cnt).append('\n');
		}
		
		System.out.println(sb);
		br.close();
	}
}
Comments