Camilla
young Camilla
Camilla
  • 전체보기 (90)
    • Data Analysis (1)
    • SAP (5)
      • SAP Datasphere (0)
      • SAP HANA DB (1)
      • SAP Analytics Cloud (0)
      • SAP BW (4)
    • Web (51)
      • JavaScript (8)
      • React (10)
      • WebRTC (3)
      • node.js (7)
      • Vue (2)
      • CSS (2)
      • 기타 (19)
    • CS (13)
      • Network (8)
      • OS (5)
    • 기타 (2)
      • Git (1)
      • Unity (1)
    • 알고리즘 문제 풀이 (11)
      • 백준 (9)
      • 프로그래머스 (2)
    • 회고 (6)
    • 취준 (0)

More

  • 방명록
  • Github

태그

  • 리액트프로젝트
  • fontawsomereact
  • 채팅기능구현
  • JavaScript
  • 리액트채팅
  • 리액트아이콘
  • fontawsome리액트
  • 리액트
  • fontawsome

최근 댓글

인기 글

티스토리

hELLO · Designed By 정상우.
Camilla

young Camilla

[백준 14502] 연구소 java
알고리즘 문제 풀이/백준

[백준 14502] 연구소 java

2022. 4. 8. 12:35

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

문제

안전 영역이 최대가 되도록 벽 3개를 세웠을 때의 안전 영역 크기 구하기.
0: 빈칸
1: 벽
2: 바이러스
바이러스는 상하좌우 인접한 빈칸으로 퍼져 나갈 수 있으며 벽을 만나면 멈춘다.



문제 예제 2번의 경우 

빨간색 위치에 벽을 세우고 나면 바이러스가 초록색 칸들로 퍼진다.

이후 남은 0의 개수는 9개가 된다.

풀이 방법

벽 3개를 세우는 모든 경우에서 안전 영역의 크기를 계산해서 최대 안전 영역의 크기를 계산한다.

  1. 벽 3개를 세운다.
  2. 바이러스가를 전파 시킨다.
  3. 빈칸(안전영역)의 크기를 센다.

코드

처음엔 안전 영역이 여러개 나오면 그 중 가장 큰 안전 영역의 값이 답인줄 알았는데
그런게 아니고 그냥 지도 전체에서 0의 개수만을 세어주면 되는것이었다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class BOJ_14502_연구소 {
    static int N,M;
    static int[][] map;
    static boolean[][] visited;
    static boolean[][] checked;
    static int res;
    static int[] dx = { -1, 0, 1, 0 };
    static int[] dy = { 0, 1, 0, -1 };

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

        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

        map = new int[N][M];
        visited = new boolean[N][M];
        for(int i=0;i<N;i++) {
            st = new StringTokenizer(br.readLine());
            for(int j=0;j<M;j++) {
                map[i][j]= Integer.parseInt(st.nextToken());
            }
        }

        dfs(0,0,0);
        System.out.println(res);

    }


    private static void dfs(int L, int x, int y) {
        if(L==3) {
            find();
            return;
        }

        for(int i=0;i<N;i++) {
            for(int j=0;j<M;j++) {
                if(!visited[i][j]&&map[i][j]==0) {
                    visited[i][j]=true;
                    map[i][j]=1;
                    dfs(L+1,i,j);
                    map[i][j]=0;
                    visited[i][j]=false;
                }
            }
        }
    }


    private static void find() {

        checked =  new boolean[N][M];
        for(int i=0;i<N;i++) {
            for(int j=0;j<M;j++) {
                if(!checked[i][j]&& map[i][j]==2) {
                    virus(i,j);
                }
            }
        }
        int size = 0;
        for(int i=0;i<N;i++) {
            for(int j=0;j<M;j++) {
                if(!checked[i][j]&& map[i][j]==0) size++;
            }
        }
        res= Math.max(res, size);
    }


    private static void virus(int x,int y) {
        Queue<int[]> Q = new LinkedList<>();
        checked[x][y]= true;
        Q.offer(new int[] {x,y});
        while(!Q.isEmpty()) {
            int[] now = Q.poll();
            for(int i=0;i<4;i++) {
                int nx = now[0]+dx[i];
                int ny = now[1]+dy[i];
                if(nx<0||nx>=N||ny<0||ny>=M||checked[nx][ny] ||map[nx][ny]==1) continue;
                checked[nx][ny]=true;
                Q.offer(new int[] {nx,ny});
            }
        }

    }
}

저작자표시 비영리 변경금지 (새창열림)
    '알고리즘 문제 풀이/백준' 카테고리의 다른 글
    • [백준 2467] 용액 java
    • [SWEA 1949] 등산로 조정
    • [백준 17069] 파이프 옮기기2 java
    • [SWEA 1249] 보급로 java
    Camilla
    Camilla
    BI Engineer Data Warehouse & Visualization

    티스토리툴바