백준|2638번|치즈

JSK·2022년 7월 31일
0

자바 PS풀이

목록 보기
33/51

문제설명
모눈 종이에 치즈가 있고 이 치즈는 4 면중 2면 이상이 외부 공기와 접촉할 때, 1시간만에 녹는다면 치즈가 모두 녹는데 걸리는 시간은 얼마인지를 구하는 문제입니다.

작동 순서
1. 치즈의 크기를 입력받습니다.
2. 치즈의 위치를 입력받습니다.
3. 외부 공기에서부터 탐색을 시작합니다.
4. 외부 공기에서 탐색을 하다가 치즈를 만나면 그 치즈의 한면이 외부 공기와 만난다는 것을 표시해줍니다.
5. 만약 치즈의 2면 이상이 외부 공기와 만날 경우 그 치즈를 이번 시간에 녹는 치즈로 지정합니다.
6. 위 과정을 반복하여 치즈가 모두 녹는데 걸리는 시간이 얼마인지를 측정하고 출력합니다.

소스코드

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

public class 백준_2638번_치즈 {
    static int row, column;
    static int[][] check = {{-1, 0},{1, 0},{0,-1},{0,1}};
    static int hour=0;

    static Queue<Integer> rowQueue = new LinkedList<>();
    static Queue<Integer> columnQueue = new LinkedList<>();
    static Queue<Integer> rowQueueTemp = new LinkedList<>();
    static Queue<Integer> columnQueueTemp = new LinkedList<>();


    static void checkMap(int meltingRow, int meltingColumn, int[][] map, boolean[][][] visited){
        for(int i=0;i<4;i++){
            if(meltingRow+check[i][0] >=0 & meltingRow+check[i][0] <= row+1 & meltingColumn+check[i][1] >= 0 & meltingColumn+check[i][1] <= column+1){
                if(!visited[meltingRow+check[i][0]][meltingColumn+check[i][1]][4]){
                    if(map[meltingRow+check[i][0]][meltingColumn+check[i][1]]>=1){
                        if(!visited[meltingRow+check[i][0]][meltingColumn+check[i][1]][i]){
                            map[meltingRow+check[i][0]][meltingColumn+check[i][1]]+=1;
                            visited[meltingRow+check[i][0]][meltingColumn+check[i][1]][i]=true;
                            if(map[meltingRow+check[i][0]][meltingColumn+check[i][1]]>=3){
                                rowQueueTemp.add(meltingRow+check[i][0]);
                                columnQueueTemp.add(meltingColumn+check[i][1]);
                            }
                        }
                    }
                    else{
                        rowQueue.add(meltingRow+check[i][0]);
                        columnQueue.add(meltingColumn+check[i][1]);
                        visited[meltingRow+check[i][0]][meltingColumn+check[i][1]][4]=true;
                    }
                }

            }
        }
    }

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

        row=Integer.parseInt(st.nextToken());
        column=Integer.parseInt(st.nextToken());

        int[][] map = new int[row+2][column+2];
        boolean[][][] visited = new boolean[row+2][column+2][5];

        for(int i=1;i<row;i++){
            st = new StringTokenizer(br.readLine());
            for(int j=1;j<column;j++)
            {
                map[i][j]=Integer.parseInt(st.nextToken());
            }
        }

        rowQueue.add(0);
        columnQueue.add(0);

        while(!rowQueue.isEmpty()){
            while(!rowQueue.isEmpty()){
                int meltingRow=rowQueue.poll();
                int meltingColumn=columnQueue.poll();
                checkMap(meltingRow, meltingColumn, map, visited);
            }



            while(!rowQueueTemp.isEmpty()){
                int meltedRow=rowQueueTemp.poll();
                int meltedColumn=columnQueueTemp.poll();
                map[meltedRow][meltedColumn]=0;
                rowQueue.add(meltedRow);
                columnQueue.add(meltedColumn);
            }

            for(int i=1;i<=row;i++){
                for (int j=1;j<=column;j++) {
                    if(map[i][j]>1) map[i][j]=1;
                    for(int k=0;k<5;k++) visited[i][j][k]=false;
                }
            }
            hour+=1;
        }
        System.out.print(hour-1);
    }
}

후기
코드가 굉장히 복잡하고 비효율적인 것 같습니다. 계속해서 노력해서 꾸준한 발전을 이루어야할 것 같습니다.

profile
학사지만 AI하고 싶어요...

0개의 댓글