베어_
TechBear
베어_
전체 방문자
오늘
어제
  • 분류 전체보기 (336)
    • Spring (33)
      • 개념 (13)
      • Security (5)
      • 실습 (1)
      • 토비 스프링 (11)
    • JPA (6)
    • 프로젝트 기록 (24)
    • DB (13)
    • JAVA (18)
    • 알고리즘 (50)
      • 유형정리 (8)
      • Baekjoon (21)
      • LeetCode (18)
    • 디자인패턴 (0)
    • 개발서적 (79)
      • Effective Java (78)
      • 객체지향의 사실과 오해 (1)
    • 독후감 (4)
    • 보안 (2)
    • 운영체제(OS) (53)
      • 공룡책 (53)
    • 컴퓨터 네트워크 (28)
      • 컴퓨터 네트워크 하향식 접근 (23)
    • 자료구조 (1)
    • DevOps (2)
    • 앱 개발 (20)
      • 안드로이드 스튜디오 (20)

블로그 메뉴

    공지사항

    인기 글

    태그

    • BFS
    • 스레드
    • 토비스프링
    • java
    • 알고리즘
    • 데이터베이스
    • 스프링
    • 백준
    • 코드업
    • 이펙티브자바
    • 자바
    • Spring
    • C++
    • dfs
    • 함수형인터페이스
    • jpa
    • 운영체제
    • leetcode
    • 자바8
    • 스프링시큐리티

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    베어_

    TechBear

    알고리즘/Baekjoon

    [백준] 7569 토마토 (JAVA)

    2022. 4. 5. 11:20

    ✉️문제

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

     

    7569번: 토마토

    첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,

    www.acmicpc.net

     

    📝 접근

    7576번과 똑같은 BFS 문제이다. 여기서 배열이 2차원 -> 3차원으로 변경된 문제라고 생각하면 된다.

    https://brightmango.tistory.com/323

     

    [백준] 7576 토마토 (JAVA)

    ✉️문제 https://www.acmicpc.net/problem/7576 7576번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,0..

    brightmango.tistory.com

     

     

    🗝 문제풀이

    1. 입력을 받을 때 박스의 아래부터 저장해야 하기 때문에 n - 1부터 시작하며, 만약 익은 토마토(1)이면 Queue에 바로 집어넣는다.

    // 입력 받기 - 박스의 아래부터 저장해야 하므로 n-1부터 시작
    for(int k = h-1; k >= 0; k--) {
        for (int i = n - 1; i >= 0; i--) {
            for (int j = m - 1; j >= 0; j--) {
                int t = sc.nextInt();
                box[k][i][j] = t;
                if (t == 1) q.add(new Point(k,i,j));
            }
        }
    }

     

    2. 앞, 뒤, 옆, 위, 아래에 대한 좌표를 dx,dy,dz를 이용해 표현해 준다. 

    static int dx[] = {-1, 0, 0, 1, 0, 0};
    static int dy[] = {0, -1, 1, 0, 0, 0};
    static int dz[] = {0, 0, 0, 0, 1, -1};

     

    3. Queue에 담긴 Point 객체를 하나씩 꺼낸다음, 현재 토마토(tmp)에 토마토가 익은 날짜(tmp+1)를 ch배열에 입력한다.

    public static void BFS() {
        while(!q.isEmpty()) {
            Point tmp = q.poll();
            for(int i = 0; i < dx.length; i++) {
                int nx = tmp.x - dx[i];
                int ny = tmp.y - dy[i];
                int nh = tmp.h - dz[i];
                if(nx >= 0 && nx < n && ny >= 0 && ny < m && nh >= 0 && nh < h && box[nh][nx][ny] == 0) {
                    box[nh][nx][ny] = 1;
                    q.add(new Point(nh, nx, ny));
                    ch[nh][nx][ny] = ch[tmp.h][tmp.x][tmp.y] + 1;
                }
            }
        }
    }

     

    전체코드

    package baekjoon;
    
    import java.util.*;
    
    public class B7569 {
    
        static int dx[] = {-1, 0, 0, 1, 0, 0};
        static int dy[] = {0, -1, 1, 0, 0, 0};
        static int dz[] = {0, 0, 0, 0, 1, -1};
    
        static int[][][] ch, box;
        static int m,n,h;
        static Queue<Point> q = new LinkedList<>();
    
        static class Point {
            int h, x, y;
    
            public Point(int h, int x, int y) {
                this.h = h;
                this.x = x;
                this.y = y;
            }
        }
    
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
    
            m = sc.nextInt(); // 가로칸 수
            n = sc.nextInt(); // 세로칸 수
            h = sc.nextInt(); // 상자의 수
    
            box = new int[h][n][m];
            ch = new int[h][n][m];
    
            // 입력 받기 - 박스의 아래부터 저장해야 하므로 n-1부터 시작
            for(int k = h-1; k >= 0; k--) {
                for (int i = n - 1; i >= 0; i--) {
                    for (int j = m - 1; j >= 0; j--) {
                        int t = sc.nextInt();
                        box[k][i][j] = t;
                        if (t == 1) q.add(new Point(k,i,j));
                    }
                }
            }
    
            BFS();
    
            if(checkTomato()) System.out.print(findLastDay());
            else System.out.print(-1);
        }
    
        private static int findLastDay() {
            int answer = Integer.MIN_VALUE;
            for(int i = h-1; i >= 0; i--) {
                for(int j = n-1; j >= 0; j--) {
                    for(int k = m-1; k >= 0; k--) {
                        answer = Math.max(answer, ch[i][j][k]);
                    }
                }
            }
            return answer;
        }
    
        private static boolean checkTomato() {
            for(int k = h -1; k >= 0; k--) {
                for (int i = n - 1; i >= 0; i--) {
                    for (int j = m - 1; j >= 0; j--) {
                        if(box[k][i][j] == 0) return false;
                    }
                }
            }
            return true;
        }
    
        // 1 : 익은 토마토, 0 : 익지 않은 토마토, -1 : 토마토 x
        // 토마토는 위, 아래, 왼쪽, 오른쪽, 앞, 뒤 여섯 방향으로 익게 만든다.
        public static void BFS() {
            while(!q.isEmpty()) {
                Point tmp = q.poll();
                for(int i = 0; i < dx.length; i++) {
                    int nx = tmp.x - dx[i];
                    int ny = tmp.y - dy[i];
                    int nh = tmp.h - dz[i];
                    if(nx >= 0 && nx < n && ny >= 0 && ny < m && nh >= 0 && nh < h && box[nh][nx][ny] == 0) {
                        box[nh][nx][ny] = 1;
                        q.add(new Point(nh, nx, ny));
                        ch[nh][nx][ny] = ch[tmp.h][tmp.x][tmp.y] + 1;
                    }
                }
            }
        }
    }
      '알고리즘/Baekjoon' 카테고리의 다른 글
      • [백준] 5014 스타트링크 (JAVA)
      • [백준] 1697 숨바꼭질 (JAVA)
      • [백준] 7576 토마토 (JAVA)
      • [백준] 2606 바이러스(JAVA)
      베어_
      베어_
      Today I learned | 문제를 해결하는 개발자

      티스토리툴바