[Java] 2638번 치즈

ideal dev·2022년 12월 16일
0

코딩테스트

목록 보기
12/69

1. 문제 링크 및 문제

1-1 문제 요약

: '1' 주변에 '0'이 2개 이상 있을 때 0으로 만들어야 함.
추가조건 0이 1 내부에 둘러쌓여 있을 때 제외

2. 해결 방법 생각해보자 ...

  1. (0,0)에서 BFS 시작, 1을 만나면 해당 좌표에 +1 을 한다.
  2. 배열에서 3 이상인 값은 0으로 만들고(2변 이상 실내온도의 공기와 접촉), 2인 값은 1로 만들어준 후 BFS 실행
  3. 배열 전체가 0 이 될 때 까지 이 과정을 반복한다.

3. 코드

import java.util.*;
import java.io.*;
import java.awt.Point;

public class Main {

    static int[][] map ;
    static boolean[][] visited;
    static int N,M,time;
    static int[] dx = {-1,0,1,0};
    static int[] dy = {0,1,0,-1};
    static Queue<Point> que = new LinkedList<>();

    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];
		

		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());
			}
		}
        // <-- 값 입력받기
        
        while(true){
            boolean noCheese = true;
            Search(0,0);

            for (int i=0;i<N;i++){
                for(int j=0;j<M;j++){
                    if(map[i][j]>=3){
                        map[i][j] = 0;
                        noCheese = false;
                    }else if(map[i][j] == 2){
                        map[i][j] = 1;
                    }
                }
            }

            if(noCheese){
                System.out.println(time);
                break;
            } 
            time += 1;
        }

    }

	// 공기노출된 치즈 +1 하기
    public static void Search(int x, int y){
        que.offer(new Point(x,y));
        visited = new boolean[N][M];
        visited[x][y] = true;

        while(!que.isEmpty()){
            Point now = que.poll();
            for(int i=0;i<4;i++){
                int xx = now.x+dx[i];
                int yy = now.y+dy[i];
                if(xx<0 || xx>=N || yy<0 || yy>=M ) continue;
                if(map[xx][yy] >= 1){
                    map[xx][yy] += 1; 
                }else if (!visited[xx][yy]){
                    que.offer(new Point(xx,yy));
                    visited[xx][yy] = true;
                }
            }    
        }

    }
}

!

내부 치즈를 어떻게 하나 했는데.
0,0 에서 출발해서
1을 만나면 +1 하고, 0이면 큐에 추가하는 방식으로 1 내부 0에는 접근 못하게 하는 접근방식에 감탄 또 감탄

0개의 댓글