ahlight
개발 저장소
ahlight
전체 방문자
오늘
어제
  • 분류 전체보기 (197)
    • Java (7)
    • Spring (5)
    • JPA (2)
    • JavaScript (0)
    • Computer Science (12)
      • 디자인패턴, 프로그래밍 패러다임 (1)
      • 네트워크 (4)
      • 운영체제 (4)
      • 데이터베이스 (3)
      • 자료구조 (0)
    • 알고리즘 (1)
    • 프로그래머스 (13)
    • 백준 (94)
    • 서평 (3)
    • 회고 (1)
    • TIL (58)
    • 기타 (1)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • 넥스트스텝
  • Java
  • 클린코드
  • 라즈베리파이4 #홈서버 #포트포워딩 #dhcp
  • TDD

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ahlight

개발 저장소

백준

백준 2468

2022. 12. 6. 19:17

문제

https://www.acmicpc.net/problem/2468

 

2468번: 안전 영역

재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는

www.acmicpc.net

import java.util.Scanner;

public class Main2468 {
	
	static int N;
	static int[][] map;
	static boolean[][] visited;
	static int[] ax = {1,-1,0,0};
	static int[] ay = {0,0,1,-1};
	static int max;
	
	public static void dfs(int[][] temp, int x , int y) {
		visited[x][y] = true;
		
		for (int i=0; i<4; i++) {
			int nx = x+ax[i];
			int ny = y+ay[i];
			
			if (nx>=0 && ny>=0 && nx<N && ny<N && !visited[nx][ny]) {
				if (temp[nx][ny] != 0) {
					dfs(temp, nx, ny);
				}
			}
		}
		
	}
	
	public static void heightCheck(int height) {
		int count = 0;
		int temp[][] = new int[N][N];
		
		for (int i=0; i<N; i++) {
			temp[i] = map[i].clone();
		}
		
		for (int i=0; i<N; i++) {
			for (int j=0; j<N; j++) {
				if (temp[i][j] <= height) {
					temp[i][j] = 0;
				}
			}
		}
		
		
		for (int i=0; i<N; i++) {
			for (int j=0; j<N; j++) {
				if (temp[i][j] != 0 && !visited[i][j]) {	
					dfs(temp,i,j);
					count++;
				}
			}
		}
		
		if (max < count) {
			max = count;
		}
	}
	
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		N = sc.nextInt();
		map = new int[N][N];
		visited = new boolean[N][N];
		
		for (int i=0; i<N; i++) {
			for (int j=0; j<N; j++) {
				map[i][j] = sc.nextInt();
			}
		}
		
		sc.close();
		
        // 아무지역도 안잠기는 경우의 수도 있기 때문에 0부터 시작
		for (int i=0; i<=100; i++) {
			heightCheck(i);
			visited = new boolean[N][N];
		}
		
		System.out.println(max);
	}
}

1. 오랜만에 어렵지 않게 풀은 문제다. 하지만 첫번째 제출은 오답이었는데 주석처리 부분인 반복문에서 초기식을 i=1로 했기 때문이다. 문제를 다시 보니 아무지역도 안잠길수 있다라는 설정이 맨아래 노트에 적혀있었다.

 

2. 혹시나 해서 0으로 바꿔주니 정답처리 됐다. 문제 해결법은

첫째, 임시2차원 배열 생성 후 매 반복마다 초기화 및 map배열 깊은 복사

둘째, 강수량(main메소드 안에 마지막 반복문의 i)이하인 지역의 높이를 0으로 변환

셋째, temp배열을 깊이우선탐색하며 0을 만나기 전까지 방문체크

넷째, 지역의 높이가 1~100이기에 각 높이마다 방문배열을 초기화

 

3. 다만 백준 문제의 경우 하단에 문제 분류가 나와있기에 dfs방식으로 접근을 했는데 만약 실제 코테라면 dfs로 풀지 bfs로 풀어야 할지 헷갈릴듯하다. 두 방식을 언제써야하는지에 대해서도 추가적으로 알아보자.

'백준' 카테고리의 다른 글

백준 11660번 자바 ☆  (0) 2022.12.09
백준 10026번 자바  (0) 2022.12.07
백준 2146 ☆  (2) 2022.12.05
백준 16236 자바 ☆  (0) 2022.12.05
백준 14502번 ☆  (0) 2022.12.01
    '백준' 카테고리의 다른 글
    • 백준 11660번 자바 ☆
    • 백준 10026번 자바
    • 백준 2146 ☆
    • 백준 16236 자바 ☆
    ahlight
    ahlight

    티스토리툴바