01-09 04:37
Recent Posts
Recent Comments
관리 메뉴

miinsun

[BAEKJOON] λ°±μ€€ BFS 2468 :: μ•ˆμ „ μ˜μ—­ λ³Έλ¬Έ

Algorithm/Baekjoon

[BAEKJOON] λ°±μ€€ BFS 2468 :: μ•ˆμ „ μ˜μ—­

miinsun 2022. 6. 12. 00:19

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

μž¬λ‚œλ°©μž¬μ²­μ—μ„œλŠ” λ§Žμ€ λΉ„κ°€ λ‚΄λ¦¬λŠ” μž₯λ§ˆμ² μ— λŒ€λΉ„ν•΄μ„œ λ‹€μŒκ³Ό 같은 일을 κ³„νšν•˜κ³  μžˆλ‹€. λ¨Όμ € μ–΄λ–€ μ§€μ—­μ˜ 높이 정보λ₯Ό νŒŒμ•…ν•œλ‹€. κ·Έ λ‹€μŒμ— κ·Έ 지역에 λ§Žμ€ λΉ„κ°€ 내렸을 λ•Œ 물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ΄ μ΅œλŒ€λ‘œ λͺ‡ κ°œκ°€ λ§Œλ“€μ–΄ μ§€λŠ” 지λ₯Ό μ‘°μ‚¬ν•˜λ €κ³  ν•œλ‹€.

μ΄λ•Œ, 문제λ₯Ό κ°„λ‹¨ν•˜κ²Œ ν•˜κΈ° μœ„ν•˜μ—¬, μž₯λ§ˆμ² μ— λ‚΄λ¦¬λŠ” λΉ„μ˜ 양에 따라 μΌμ •ν•œ 높이 μ΄ν•˜μ˜ λͺ¨λ“  지점은 물에 μž κΈ΄λ‹€κ³  κ°€μ •ν•œλ‹€.
μ–΄λ–€ μ§€μ—­μ˜ 높이 μ •λ³΄λŠ” ν–‰κ³Ό μ—΄μ˜ 크기가 각각 N인 2차원 λ°°μ—΄ ν˜•νƒœλ‘œ 주어지며 λ°°μ—΄μ˜ 각 μ›μ†ŒλŠ” ν•΄λ‹Ή μ§€μ μ˜ 높이λ₯Ό ν‘œμ‹œν•˜λŠ” μžμ—°μˆ˜μ΄λ‹€.

예λ₯Ό λ“€μ–΄, λ‹€μŒμ€ N=5인 μ§€μ—­μ˜ 높이 정보이닀.
이제 μœ„μ™€ 같은 지역에 λ§Žμ€ λΉ„κ°€ λ‚΄λ €μ„œ 높이가 4 μ΄ν•˜μΈ λͺ¨λ“  지점이 물에 μž κ²Όλ‹€κ³  ν•˜μž.
이 κ²½μš°μ— 물에 μž κΈ°λŠ” 지점을 νšŒμƒ‰μœΌλ‘œ ν‘œμ‹œν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€. 
물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ΄λΌ 함은 물에 μž κΈ°μ§€ μ•ŠλŠ” 지점듀이 μœ„, μ•„λž˜, 였λ₯Έμͺ½ ν˜Ήμ€ μ™Όμͺ½μœΌλ‘œ 인접해 있으며 κ·Έ 크기가 μ΅œλŒ€μΈ μ˜μ—­μ„ λ§ν•œλ‹€. μœ„μ˜ κ²½μš°μ—μ„œ 물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ€ 5κ°œκ°€ λœλ‹€(κΌ­μ§“μ μœΌλ‘œλ§Œ λΆ™μ–΄ μžˆλŠ” 두 지점은 μΈμ ‘ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  μ·¨κΈ‰ν•œλ‹€). 

λ˜ν•œ μœ„μ™€ 같은 μ§€μ—­μ—μ„œ 높이가 6μ΄ν•˜μΈ 지점을 λͺ¨λ‘ 잠기게 λ§Œλ“œλŠ” λ§Žμ€ λΉ„κ°€ 내리면 물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ€ μ•„λž˜ κ·Έλ¦Όμ—μ„œμ™€ 같이 λ„€ κ°œκ°€ 됨을 확인할 수 μžˆλ‹€. 
이와 같이 μž₯λ§ˆμ² μ— λ‚΄λ¦¬λŠ” λΉ„μ˜ 양에 λ”°λΌμ„œ 물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ˜ κ°œμˆ˜λŠ” λ‹€λ₯΄κ²Œ λœλ‹€. μœ„μ˜ μ˜ˆμ™€ 같은 μ§€μ—­μ—μ„œ λ‚΄λ¦¬λŠ” λΉ„μ˜ 양에 λ”°λ₯Έ λͺ¨λ“  경우λ₯Ό λ‹€ 쑰사해 보면 물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ˜ 개수 μ€‘μ—μ„œ μ΅œλŒ€μΈ κ²½μš°λŠ” 5μž„μ„ μ•Œ 수 μžˆλ‹€. 

μ–΄λ–€ μ§€μ—­μ˜ 높이 정보가 μ£Όμ–΄μ‘Œμ„ λ•Œ, μž₯λ§ˆμ² μ— 물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ˜ μ΅œλŒ€ 개수λ₯Ό κ³„μ‚°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. 

 

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

μž…λ ₯ 

  • 첫째 μ€„μ—λŠ” μ–΄λ–€ 지역을 λ‚˜νƒ€λ‚΄λŠ” 2차원 λ°°μ—΄μ˜ ν–‰κ³Ό μ—΄μ˜ 개수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 수 N이 μž…λ ₯λœλ‹€.
  • N은 2 이상 100 μ΄ν•˜μ˜ μ •μˆ˜μ΄λ‹€.
  • λ‘˜μ§Έ 쀄뢀터 N개의 각 μ€„μ—λŠ” 2차원 λ°°μ—΄μ˜ 첫 번째 ν–‰λΆ€ν„° N번째 ν–‰κΉŒμ§€ μˆœμ„œλŒ€λ‘œ ν•œ ν–‰μ”© 높이 정보가 μž…λ ₯λœλ‹€.
  • 각 μ€„μ—λŠ” 각 ν–‰μ˜ 첫 번째 μ—΄λΆ€ν„° N번째 μ—΄κΉŒμ§€ N개의 높이 정보λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μžμ—°μˆ˜κ°€ 빈 칸을 사이에 두고 μž…λ ₯λœλ‹€.
  • λ†’μ΄λŠ” 1이상 100 μ΄ν•˜μ˜ μ •μˆ˜μ΄λ‹€.

 

좜λ ₯

  • 첫째 쀄에 μž₯λ§ˆμ² μ— 물에 μž κΈ°μ§€ μ•ŠλŠ” μ•ˆμ „ν•œ μ˜μ—­μ˜ μ΅œλŒ€ 개수λ₯Ό 좜λ ₯ν•œλ‹€.

 

예제 μž…λ ₯ 1)

5
6 8 2 6 2
3 2 3 4 6
6 7 3 3 2
7 2 5 3 6
8 9 5 2 7

 

예제 좜λ ₯ 1)

5

 

예제 μž…λ ₯ 2)

7
9 9 9 9 9 9 9
9 2 1 2 1 2 9
9 1 8 7 8 1 9
9 2 7 9 7 2 9
9 1 8 7 8 1 9
9 2 1 2 1 2 9
9 9 9 9 9 9 9

 

예제 좜λ ₯ 2)

6

​

 

​

πŸ’»  Main.java

  • BFS와 DFS둜 ν’€ 수 μžˆλŠ” 문제! λ‚˜λŠ” 쒀더 속도가 λΉ λ₯Έ BFS둜 문제λ₯Ό 풀도둝 ν–ˆλ‹€.
  • μ§€μ—­μ˜ μ’Œν‘œλ₯Ό μ €μž₯해쀄 Point 객체λ₯Ό λ§Œλ“ λ‹€
  • 지역 μ •λ³΄λŠ” board에 μ €μž₯ν•˜κ³ , μ•ˆμ „ μ§€λŒ€μ˜ μ •λ³΄λŠ” safe에 μ €μž₯해쀬닀.
    • μ΄λ•Œ safeκ°€ 쀑볡 방문을 막도둝 λ°©λ¬Έ 기둝을 ν‘œμ‹œν•˜λŠ” 역할을 ν•œλ‹€.
  • 0λΆ€ν„° μ§€μ—­μ˜ μ΅œλŒ€ λ†’μ΄κΉŒμ§€ λΉ„κ°€ μŸμ•„μ˜¬ 수 μžˆλ„λ‘ μ˜ˆμƒν•˜κ³  (λΉ„κ°€ μ•ˆμ˜¬μˆ˜λ„  있기 λ•Œλ¬Έμ— 0포함, 0~maxHeight)
  • 차였λ₯΄λŠ” 높이보닀 높은 지역을 μ§€λ‚˜κ°ˆλ•Œ 넓이 μš°μ„  탐색을 μ§„ν–‰ν•΄μ£Όμž
/* λ°±μ€€ - 2468 :: μ•ˆμ „ μ˜μ—­ */
import java.util.*;

import java.io.*;
class Point {
	public int x, y;
	Point (int x, int y){
		this.x = x;
		this.y = y;
	}
}

public class Main {
	// μƒν•˜μ’Œμš°λ₯Ό μ§€λ‚˜κ°€λ„λ‘ dx,dy μ„ΈνŒ…
	static int[] dx = {-1, 0, 1, 0};
	static int[] dy = {0, 1, 0, -1};
	static int[][] board, safe;
	static Queue<Point> q = new LinkedList<>();
	
	public static void bfs(int height, int cnt) {				
		while(!q.isEmpty()) {
			Point tmp = q.poll();
			for(int i = 0; i < 4; i++) {
				int nx = tmp.x + dx[i];
				int ny = tmp.y + dy[i];
				
				if(nx >= 0 && nx < board.length && ny >= 0 && ny < board.length // μ˜μ—­κ²€μ‚¬
						&& board[nx][ny] > height && safe[nx][ny] == 0) {		// 물이 차였λ₯΄λŠ” 높이보닀 λ†’κ³ , λ°©λ¬Έν•œμ  μ—†λŠ” μ§€μ—­λ§Œ λ°©λ¬Έ
					q.offer(new Point(nx, ny));
					safe[nx][ny] = cnt;
				}
			}
		}
 	}
	
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
		board = new int[n][n];
		
		int maxHeight = 0;
		for(int i = 0; i < n; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());

			for(int j = 0; j < n; j++) {
				board[i][j] = Integer.parseInt(st.nextToken());
				maxHeight = Math.max(maxHeight, board[i][j]);
			}
		}
		
		int answer = 0;
		for(int i = 0; i < maxHeight; i++) {					// 물이 차였λ₯΄λŠ” 높이
			safe = new int[n][n];
			int cnt = 1;
			for(int j = 0; j < n; j++) {						// xμ’Œν‘œ
				for(int k = 0; k < n; k++) {					// yμ’Œν‘œ
					if(board[j][k] > i && safe[j][k] == 0) {	// λ°©λ¬Έν•œμ μ΄ μ—†κ³ , 물이 차였λ₯΄λŠ” 높이보닀 높은 μ§€μ λ§Œ λ°©λ¬Έ
						q.offer(new Point(j, k));
						bfs(i, cnt);
						answer = Math.max(answer, cnt);
						cnt++;
					}
				}
			}
		}
		
		System.out.println(answer);
		
        br.close();
	}
}
Comments