본문 바로가기
알고리즘/구현

[백준 풀이_Java] 14502 연구소 (골드4)

by happyhelen 2024. 2. 19.

 

복잡한 구현문제는 속도를 신경쓰기전에 일단 구현하는 것이 관건이다.

 

이 문제는 dfs, 백트래킹을 모두 사용하는 구현문제였다.

 

어렵당,,

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Array;
import java.util.*;


public class Main {

    static int sero;
    static int garo;
    static int[][] board;
    static int[][] moves = {{-1,0}, {1,0}, {0,1}, {0,-1}}; //위 아래 오른 왼
    static StringBuilder sb = new StringBuilder();
    static Queue<int[]> virus = new LinkedList<>();
    static HashSet<Integer> result = new HashSet<>();

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");
        sero = Integer.parseInt(input[0]);
        garo = Integer.parseInt(input[1]);
        board = new int[sero][garo];

        for(int i=0; i<sero; i++){
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
            for(int j=0; j<garo; j++){
                board[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        addBoard(0);
        System.out.println(Collections.max(result));

    }

    private static void addBoard(int cntB) {
    
        if(cntB == 3) {
            spreadVirus();
        }else{
            for (int i = 0; i<sero; i++){
                for(int j=0; j<garo;j++){
                    if(board[i][j] == 0){
                        board[i][j] = 1;
                    //    System.out.println("i:"+i+",j:"+j);
                        addBoard(cntB+1);
                        board[i][j] = 0;
                    }
                }
            }
        }

    }


    public static void spreadVirus() {

        int[][] cpymap = new int[sero][garo];
        for (int i=0;i<sero;i++){
            for(int j=0;j<garo;j++){
                cpymap[i][j] = board[i][j];
                if(cpymap[i][j] == 2) {
                    virus.add(new int[]{i,j});
                }
            }
        }

        while (!virus.isEmpty()){
            int[] vi = virus.remove();
            for(int[]move : moves){
                int i = vi[0] + move[0];
                int j = vi[1] + move[1];
                if(i>=0 && j>=0 && i<sero && j<garo && cpymap[i][j]==0){
                    cpymap[i][j] = 2; // 바이러스 침투
                    virus.add(new int[]{i,j});
                }
            }
        }
        safeArea(cpymap);
    }


    public static void safeArea(int[][]cpymap){
    
        int safe = 0;
        for (int i=0;i<sero;i++){
            for(int j=0;j<garo;j++){
                if(cpymap[i][j] == 0) safe++;
            }
        }
        result.add(safe);
    }

}

 

 

'알고리즘 > 구현' 카테고리의 다른 글

[백준 풀이_Java] 73659024 스택 (실버4)  (0) 2024.02.19