베어_
TechBear
베어_
전체 방문자
오늘
어제
  • 분류 전체보기 (336)
    • Spring (33)
      • 개념 (13)
      • Security (5)
      • 실습 (1)
      • 토비 스프링 (11)
    • JPA (6)
    • 프로젝트 기록 (24)
    • DB (13)
    • JAVA (18)
    • 알고리즘 (50)
      • 유형정리 (8)
      • Baekjoon (21)
      • LeetCode (18)
    • 디자인패턴 (0)
    • 개발서적 (79)
      • Effective Java (78)
      • 객체지향의 사실과 오해 (1)
    • 독후감 (4)
    • 보안 (2)
    • 운영체제(OS) (53)
      • 공룡책 (53)
    • 컴퓨터 네트워크 (28)
      • 컴퓨터 네트워크 하향식 접근 (23)
    • 자료구조 (1)
    • DevOps (2)
    • 앱 개발 (20)
      • 안드로이드 스튜디오 (20)

블로그 메뉴

    공지사항

    인기 글

    태그

    • 자바8
    • Spring
    • 스프링
    • leetcode
    • 이펙티브자바
    • BFS
    • dfs
    • 토비스프링
    • 알고리즘
    • java
    • 코드업
    • 데이터베이스
    • 자바
    • jpa
    • 스레드
    • 백준
    • 운영체제
    • 함수형인터페이스
    • C++
    • 스프링시큐리티

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    베어_

    TechBear

    알고리즘/Baekjoon

    [백준] 2468 안전 영역 (JAVA)

    2022. 4. 10. 19:00

    ✉️문제

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

     

    2468번: 안전 영역

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

    www.acmicpc.net

     

    📝 접근

       DFS, BFS를 이용하여 문제 풀이가 가능하다. 필자는 DFS를 이용했다. (미로 찾기처럼 뻗어나가는 문제는 DFS를 이용한 풀이를 좋아하는 편이다)

     

     

     

    🗝 문제풀이

    1. 높이가 0 ~ 100 범위일 때 안전한 지역을 찾고, DFS를 이용하여 안전 지역의 범위를 체크한다. 

    ⚠️ 높이가 1 ~ 100 범위이기 때문에 h를 1로 둘 수 있는데 1부터 시작하게 되면 아무 지역도 물에 잠기지 않을 수 있다는 조건을 체크하지 못한다. 

    for(int h = 0; h <= maxHeight; h++) {
        ch = new boolean[n][n];
        int cnt = 0;
        for(int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (!ch[i][j] && area[i][j] > h) {
                    DFS(i, j, h);
                    cnt++;
                }
            }
        }
        answer = Math.max(answer, cnt);
    }

     

    [최종 코드]

    package baekjoon;
    
    import java.util.Scanner;
    
    public class B2468 {
    
        static int[][] area;
        static boolean[][] ch;
        static int[] dx = {-1, 0, 0, 1}, dy = {0, -1, 1, 0};
        static int n, answer = Integer.MIN_VALUE, maxHeight = Integer.MIN_VALUE;
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
    
            n = sc.nextInt();
            area = new int[n][n];
    
            // 지역값 입력 받기
            for(int i = 0; i < n; i++) {
                for(int j = 0; j < n; j++) {
                    area[i][j] = sc.nextInt();
                    maxHeight = Math.max(maxHeight, area[i][j]);
                }
            }
    
            // 높이는 1 ~ 100 범위이지만,
            // 1부터 시작하는 경우에 아무 지역도 물에 잠기지 않을 수 있다는 조건을 만족하지 못한다.
            for(int h = 0; h <= maxHeight; h++) {
                ch = new boolean[n][n];
                int cnt = 0;
                for(int i = 0; i < n; i++) {
                    for (int j = 0; j < n; j++) {
                        if (!ch[i][j] && area[i][j] > h) {
                            DFS(i, j, h);
                            cnt++;
                        }
                    }
                }
                answer = Math.max(answer, cnt);
            }
    
            System.out.println(answer);
    
        }
    
        private static void DFS(int x, int y, int h) {
            ch[x][y] = true;
            for(int i = 0; i < dx.length; i++) {
                int nx = x + dx[i];
                int ny = y + dy[i];
                if(nx >= 0 && nx < n && ny >= 0 && ny < n) {
                    if (!ch[nx][ny] && area[nx][ny] > h) {
                        DFS(nx, ny, h);
                    }
                }
            }
        }
    }

     

      '알고리즘/Baekjoon' 카테고리의 다른 글
      • [백준] 2501 약수 구하기 (JAVA)
      • [백준] 2573 빙산 (JAVA)
      • [백준] 5014 스타트링크 (JAVA)
      • [백준] 1697 숨바꼭질 (JAVA)
      베어_
      베어_
      Today I learned | 문제를 해결하는 개발자

      티스토리툴바