e.den
eden.dev.log
e.den
전체 방문자
오늘
어제
  • 분류 전체보기 (57)
    • 슬기로운 취준 생활 (1)
    • Study (30)
      • Swift (7)
      • iOS (6)
      • Java (2)
      • Spring (6)
      • Algorithm (9)
    • Coding Test (8)
      • Swea (0)
      • Baekjoon (8)
      • Programmers (0)
    • 삽질기 (3)
    • 독서록 (15)
      • Clean Architecture (5)
      • Clean Code (10)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Spring
  • lifecycle
  • initializer
  • 자료구조
  • flatmap
  • 알고리즘
  • cleancode
  • 클린코드
  • reduce
  • ios
  • 클린아키텍처
  • CGLayer
  • java
  • UITextView
  • 고차함수
  • swift
  • mybatis
  • property
  • 프로퍼티
  • compactMap
  • Algorithm
  • RunLoop
  • 정렬
  • 부스트코스
  • Filter
  • CoreAnimation
  • MySQL
  • CleanArchitecture
  • lombok
  • Map

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
e.den

eden.dev.log

Coding Test/Baekjoon

[BOJ] 백준 2468 안전 영역

2021. 3. 9. 22:27

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

 

2468번: 안전 영역

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

www.acmicpc.net

 

 


 

풀이 방법

  1. 내리는 비의 양에 따라 일정한 높이 이하의 모든 지점은 물에 잠긴다. 비의 양보다 지점이 더 높을 경우, 안전한 영역이므로 그 영역의 개수를 구한다.
  2. 비의 양에 따른 모든 경우를 다 조사해서 안전한 영역의 최대 갯수를 찾아야 하므로, 주어진 영역 높이의 최솟값부터 최댓값까지 모든 경우의 수를 탐색한다.
  3. dfs를 사용해서 안전 영역의 갯수를 세고 모든 경우의 수를 비교해서 최댓값을 도출한다.

 

다음은 Java로 작성한 코드이다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class B2468 {
    private static final int [] dx = { -1, 1, 0, 0 }; // 상하좌우
    private static final int [] dy = { 0, 0, -1, 1 };
    private static int n;
    private static int [][] map;
    private static boolean [][] visited;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        n = Integer.parseInt(br.readLine());

        map = new int[n][n];
        visited = new boolean[n][n];

        int max = 0;
        int min = 100;

        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());

            for (int j = 0; j < n; j++) {
                map[i][j] = Integer.parseInt(st.nextToken());

                max = Math.max(max, map[i][j]);
                min = Math.min(min, map[i][j]);
            }
        }

        int answer = 1;

        for (int height = max; height >= min; height--) {
            int count = 0;

            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    if (map[i][j] > height && !visited[i][j]) {
                        dfs(i, j, height);
                        count++;
                    }
                }
            }

            visited = new boolean[n][n];
            answer = Math.max(answer, count);
        }

        System.out.println(answer);
    }

    private static void dfs(int x, int y, int height) {
        visited[x][y] = true;

        for (int dir = 0; dir < 4; dir++) {
            int nx = x + dx[dir];
            int ny = y + dy[dir];

            if (nx >= 0 && ny >= 0 && nx < n && ny < n) {
                if (map[nx][ny] > height && !visited[nx][ny]) {
                    dfs(nx, ny, height);
                }
            }
        }
    }

}
저작자표시 (새창열림)

'Coding Test > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 11725 트리의 부모 찾기  (0) 2021.03.21
[BOJ] 백준 2343 기타 레슨  (1) 2021.03.15
[BOJ] 백준 7569 토마토  (2) 2021.03.15
[BOJ] 백준 2644 촌수계산  (2) 2021.03.09
[BOJ] 백준 14502 연구소  (2) 2021.03.09
    'Coding Test/Baekjoon' 카테고리의 다른 글
    • [BOJ] 백준 2343 기타 레슨
    • [BOJ] 백준 7569 토마토
    • [BOJ] 백준 2644 촌수계산
    • [BOJ] 백준 14502 연구소
    e.den
    e.den
    문제를 본질적으로 접근하자

    티스토리툴바