2638. 치즈 (Java)

2023. 11. 14. 11:28·Algorithm & Data Structures/BOJ

BFS를 여러번 사용하면서 바깥에서의 공기통로와 치즈의 겉부분을 체크하는 방식으로 문제를 해결.

package algorithm.src.minho;

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

class XY {
    int x;
    int y;

    public XY(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

public class b2638 {

    static int N, M, count=0;
    static int[][] map;
    static int[] dx = {-1, 0, 1, 0};
    static int[] dy = {0, -1, 0, 1};
    static boolean[][] isVisited;
    static int[][] check;
    static boolean isEnd;

    static void BFS() {
        isVisited = new boolean[N][M];
        Queue<XY> q = new ArrayDeque<>();
        q.add(new XY(0, 0));
        isVisited[0][0] = true;
        check = new int[N][M];

        while (!q.isEmpty()) {
            XY xy = q.poll();
            for (int d = 0; d < 4; d++) {
                int xd = dx[d] + xy.x;
                int yd = dy[d] + xy.y;
                if (xd >= N || xd < 0 || yd < 0 || yd >= M) continue;
                if (isVisited[xd][yd]) continue;
                if(map[xd][yd] == 1){
                    check[xd][yd]++;
                    continue;
                }
                isVisited[xd][yd] = true;
                map[xd][yd] = 2;
                q.add(new XY(xd, yd));
            }
        }

        isEnd = true;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if(check[i][j]>=2){
                    map[i][j] =0;
                }
                if(isEnd && map[i][j]==1){
                    isEnd = false;
                }
            }
        }
    }

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

        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(!isEnd){
            BFS();
            count++;
        }

        System.out.println(count);
    }
}

 

'Algorithm & Data Structures > BOJ' 카테고리의 다른 글

12851. 숨바꼭질2 (Java)  (2) 2023.11.28
1043. 거짓말 (Java)  (0) 2023.11.15
1167. 트리의 지름 (Java)  (1) 2023.11.13
11725. 트리의 부모 찾기 (Java)  (0) 2023.11.12
1967. 트리의 지름 (Java)  (0) 2023.11.09
'Algorithm & Data Structures/BOJ' 카테고리의 다른 글
  • 12851. 숨바꼭질2 (Java)
  • 1043. 거짓말 (Java)
  • 1167. 트리의 지름 (Java)
  • 11725. 트리의 부모 찾기 (Java)
Geisha
Geisha
개발 일기
  • Geisha
    Geisha
    Geisha
  • 전체
    오늘
    어제
    • 분류 전체보기 (307) N
      • Algorithm & Data Structures (233) N
        • BOJ (91) N
        • SWEA (1)
        • Programers (137) N
        • Data Structures (3)
      • DB (21)
        • SQL (15)
        • RDBMS (2)
      • Java (1)
        • Class (1)
      • Spring (5)
        • Spring MVC (1)
        • Annotations (1)
      • CS (36)
        • 운영체제 (13)
        • 네트워크 (5)
      • Tool (6)
        • Git (5)
        • AWS (1)
      • Project (1)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    binarySearch
    전위순회
    Union-Find
    스택
    dfs
    unionfind
    dp
    BFS
    백트래킹
    SQL
    Dijkstra
    Stack
    다익스트라
    골드
    Java
    PriorityQueue
    동적계획법
    이분탐색
    경로압축
    알고리즘
    백준
    투포인터
    후위순회
    유니온파인드
    DynamicProgramming
    baekjoon
    programmers
    프로그래머스
    구현
    algorithm
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Geisha
2638. 치즈 (Java)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.