e.den
eden.dev.log
e.den
전체 방문자
오늘
어제
  • 분류 전체보기 (57)
    • 슬기로운 취준 생활 (1)
    • Study (30)
      • Swift (7)
      • iOS (6)
      • Java (2)
      • Spring (6)
      • Algorithm (9)
    • Coding Test (8)
      • Swea (0)
      • Baekjoon (8)
      • Programmers (0)
    • 삽질기 (3)
    • 독서록 (15)
      • Clean Architecture (5)
      • Clean Code (10)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • swift
  • flatmap
  • 자료구조
  • 클린아키텍처
  • cleancode
  • compactMap
  • Spring
  • ios
  • Filter
  • CleanArchitecture
  • mybatis
  • 정렬
  • Algorithm
  • 프로퍼티
  • RunLoop
  • reduce
  • MySQL
  • 고차함수
  • 알고리즘
  • lombok
  • UITextView
  • Map
  • CoreAnimation
  • lifecycle
  • java
  • property
  • 클린코드
  • initializer
  • CGLayer
  • 부스트코스

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
e.den

eden.dev.log

Coding Test/Baekjoon

[BOJ] 백준 7569 토마토

2021. 3. 15. 21:23

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

 

7569번: 토마토

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

www.acmicpc.net

 


 

풀이 방법

  • 익은 토마토에 인접한 토마토들은 보관 후 하루가 지나면 위, 아래, 왼쪽, 오른쪽, 앞, 뒤 여섯 방향으로 익게 된다.
  • 앞, 뒤라는 조건이 있기 때문에 3차원 배열을 이용한다. 

3차원 배열에 대해서 간단히 설명하자면,

int [][][] = new int [x][y][z]

xyz는 일반적으로 x는 y와 z의 배열을 가진 면, y는 배열에서 열(Row), z는 배열에서 행(Column)을 지칭한다.

   

  • 익은 토마토 즉, 값이 1인 좌표를 모두 큐에 넣고 너비 우선 탐색(bfs)을 돌린다. 값이 0인 익지 않은 토마토가 있는 곳을 찾아서 큐에 넣고, 이전 위치에 +1을 하여 토마토가 익는 일수를 구한다.
  • bfs가 끝난 뒤, 익지 않은 토마토 즉, 값이 0인 곳이 있다면, 토마토가 모두 익을 수 없는 경우이므로 -1을 출력하고 그 외의 경우 배열에서 가장 큰 값을 구하면 그 값이 최소 일수가 된다.

 

다음은 Java로 작성한 코드이다.

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 B7569 {
    private static final int[] dx = {0, 0, 0, 0, 1, -1};
    private static final int[] dy = {-1, 0, 1, 0, 0, 0};
    private static final int[] dz = {0, 1, 0, -1, 0, 0};
    private static int m, n, f;
    private static int[][][] map;
    private static final Queue<Point> queue = new LinkedList<>();

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

        m = Integer.parseInt(st.nextToken());
        n = Integer.parseInt(st.nextToken());
        f = Integer.parseInt(st.nextToken());

        map = new int[f][n][m];

        for(int i = 0; i < f; i++){
            for(int j = 0; j < n; j++){
                st = new StringTokenizer(br.readLine());

                for(int k = 0; k < m; k++){
                    map[i][j][k] = Integer.parseInt(st.nextToken());

                    if(map[i][j][k] == 1) {
                        queue.add(new Point(i, j, k));
                    }
                }
            }
        }

        bfs();
    }

    private static void bfs() {
        while (!queue.isEmpty()) {
            Point point = queue.poll();

            int curX = point.x;
            int curY = point.y;
            int curZ = point.z;

            for (int dir = 0; dir < 6; dir++) {
                int nx = curX + dx[dir];
                int ny = curY + dy[dir];
                int nz = curZ + dz[dir];

                if (nx >= 0 && ny >= 0 && nz >=0 && nx < f && ny < n && nz < m) {
                    if (map[nx][ny][nz] == 0) {
                        queue.add(new Point(nx, ny, nz));
                        map[nx][ny][nz] = map[curX][curY][curZ] + 1;
                    }
                }
            }
        }

        maxValue();
    }

    private static void maxValue() {
        int max = 0;

        for (int k = 0; k < f; k++) {
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                    if (map[k][i][j] == 0) {
                        System.out.println(-1);
                        return;
                    }

                    max = Math.max(max, map[k][i][j]);
                }
            }
        }

        System.out.println(max-1);
    }

    private static class Point {
        int x; // 면
        int y; // 세로
        int z; // 가로

        public Point(int x, int y, int z) {
            this.x = x;
            this.y = y;
            this.z = z;
        }
    }
}
저작자표시 (새창열림)

'Coding Test > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 11725 트리의 부모 찾기  (0) 2021.03.21
[BOJ] 백준 2343 기타 레슨  (1) 2021.03.15
[BOJ] 백준 2644 촌수계산  (2) 2021.03.09
[BOJ] 백준 14502 연구소  (2) 2021.03.09
[BOJ] 백준 2468 안전 영역  (2) 2021.03.09
    'Coding Test/Baekjoon' 카테고리의 다른 글
    • [BOJ] 백준 11725 트리의 부모 찾기
    • [BOJ] 백준 2343 기타 레슨
    • [BOJ] 백준 2644 촌수계산
    • [BOJ] 백준 14502 연구소
    e.den
    e.den
    문제를 본질적으로 접근하자

    티스토리툴바