[백준 2638] 치즈 (골드 3)

2025. 5. 13. 18:52·Study/Algorithm
728x90

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

처음 문제를 보았을 때 아래와 같이 판단하였다.

1. BFS를 통해서 먼저 외부 공기(-1)를 구분한다.

2. 배열을 순회하면서 외부 공기랑 2면 이상 닿으면 0으로 표시한다.

3. 치즈가 없는지 판단한다.(1이 하나라도 있으면 true 반환)

 

* 문제를 풀 때, 초기화 단계를 잊어버리는 경우가 많아서 체크하기 위해 따로 적어둔다.

 

하지만 while문을 통과하지 못하는 오류가 발생하였다.

확인해보니 치즈를 녹이는 단계에서 외부 공기랑 2면 이상 닿았을 때 바로 0으로 바꾸는 것 때문에 제대로 다음 치즈들에 대해서 처리가 되지 않았다.

또한 외부 공기를 한 번 확인하고 치즈를 녹이는데 다시 외부 공기를 확인할 때 외부 공기를 다시 판단해야하는데 초기화 하지 않아서 문제가 발생한 것을 알고 코드를 다시 수정하였다.

 

최종 코드

package baekjoon._2638;

import java.util.*;
import java.io.*;
// https://www.acmicpc.net/problem/2638

public class Main {
	static int N, M;
	static int[][] map;
	static int count;
	static int[] dx = {0,0,-1,1};
	static int[] dy = {1,-1,0,0};
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		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) {
			resetAir();
			findOutsideAir(0,0);
			meltCheese();
			count++;
			if (!checkCheese()) {
				break;
			}
		}
		System.out.println(count);
		
	}
	static void findOutsideAir(int x, int y) {
		Queue<int[]> q = new LinkedList<>();
		q.add(new int[] {x, y});
		
		while(!q.isEmpty()) {
			int[] node = q.poll();
			int a = node[0];
			int b = node[1];
			
			if (map[a][b] == 0) {
				map[a][b] = -1;
			}
			for (int i=0; i<4; i++) {
				int na = a +dx[i];
				int nb = b + dy[i];
				
				if (na >= 0 && nb >= 0 && na <N && nb <M && map[na][nb] != -1) {
					if (map[na][nb] == 1) {
						continue;
					} else {
						map[na][nb] = -1;
						q.add(new int[] {na, nb});
					}
				}
			}
		}
		
		
	}
	
	static void meltCheese() {
	    boolean[][] toMelt = new boolean[N][M];

	    for (int i=0; i<N; i++) {
	        for (int j=0; j<M; j++) {
	            int exposeCount = 0;
	            if (map[i][j] == 1) {
	                for (int k=0; k<4; k++) {
	                    int nx = i + dx[k];
	                    int ny = j + dy[k];
	                    if (nx >= 0 && ny >= 0 && nx < N && ny < M && map[nx][ny] == -1) {
	                        exposeCount++;
	                    }
	                }
	            }
	            if (exposeCount >= 2) {
	                toMelt[i][j] = true;
	            }
	        }
	    }

	    for (int i=0; i<N; i++) {
	        for (int j=0; j<M; j++) {
	            if (toMelt[i][j]) {
	                map[i][j] = 0;
	            }
	        }
	    }
	}
	
	static boolean checkCheese() {
		for (int i=0; i<N; i++) {
			for (int j=0; j<M; j++) {
				if(map[i][j] == 1) {
					return true;
				}
			}
		}
		return false;
	}
	
	static void resetAir() {
	    for (int i = 0; i < N; i++) {
	        for (int j = 0; j < M; j++) {
	            if (map[i][j] == -1) {
	                map[i][j] = 0;
	            }
	        }
	    }
	}

}
728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'Study > Algorithm' 카테고리의 다른 글

[백준 32387] 충전하기 (골드 4)  (0) 2025.05.13
[백준 20040] 사이클 게임 ( 골드 4)  (0) 2025.05.13
[백준 5525] IOIOI  (1) 2024.09.03
[백준 9465] 스티커  (1) 2024.08.30
[백준 1987] 알파벳  (0) 2024.08.30
'Study/Algorithm' 카테고리의 다른 글
  • [백준 32387] 충전하기 (골드 4)
  • [백준 20040] 사이클 게임 ( 골드 4)
  • [백준 5525] IOIOI
  • [백준 9465] 스티커
pink_salt
pink_salt
유익함을 주는 개발자가 되도록 keep going
  • pink_salt
    KeepGoingForever
    pink_salt
  • 전체
    오늘
    어제
    • 분류 전체보기 (117)
      • Project (7)
      • WEB study (3)
        • WEB(Springboot) (10)
        • Git, GitLab (13)
        • Clean code (1)
        • FrontEnd (3)
      • Study (21)
        • Algorithm (19)
        • 면접 준비 (2)
      • Cloud Computing (2)
        • AWS (2)
      • 프로그래밍 언어 (35)
        • Java (29)
        • Python (0)
        • javascript (6)
      • 운영체제 (0)
        • Linux (0)
      • Database (4)
        • MongoDB (8)
        • SQL (8)
      • 애플리케이션 개발 (1)
        • Android (1)
      • AI (1)
        • Deeplearning (1)
        • machinelearning (0)
      • Daily (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    코딩이러닝
    SWEA
    빅오표기법
    코드프레소
    BFS
    Query
    Database
    무료코딩교육
    git branch
    오블완
    python
    코딩강의
    자바
    대외활동
    Git
    MongoDB
    개념
    SW
    gitlab
    Java
    mysql
    codepresso
    티스토리챌린지
    객체지향
    언어
    dp
    spring boot
    백준
    IT교육
    무료IT교육
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
pink_salt
[백준 2638] 치즈 (골드 3)
상단으로

티스토리툴바