[백준] 7569번: 토마토

ByWindow·2022년 1월 17일
0

Algorithm

목록 보기
70/104
post-thumbnail

📝 문제

첫번째 시도

문제의 그림대로 3차원배열을 만들어서 bfs 알고리즘을 사용했다.
토마토 정보에 대한 배열과 방문여부에 대한 배열. 총 두개의 3차원배열을 초기화했는데
메모리 초과가 떴다.

두번째 시도

위의 접근방식이 잘못되었음을 느끼고
기존의 토마토 정보에 대한 3차원배열을 2차원으로 만들고,
방문여부 체크는 토마토 배열에 해당 토마토가 익기까지 걸리는 날짜를 입력하여 체크했다.
문제에 제시되어있는 테케는 전부 성공하는데 제출을 하면 틀렸다는 결과가 나왔다.

세번째 시도

어디서 틀렸는지에 대해 오랜 시간 고민했다.
논리적으로 오류를 범한 곳은 3차원배열을 2차원으로 만들면서 주위 칸으로 이동할 때 생길 수 있는 오류를 생각하지 못한 것이다.
같은 층 내의 앞, 뒤로 이동하는 연산을 했을 때 위,아래층으로 이동할 수 있는 상황이 생기기 때문이다.
이 부분을 조건문으로 처리해줬고, 통과할 수 있었다.

📌 코드

package Baekjoon;

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 BOJ7569 {

  /**
   * bfs로 풀자
   */

  static int n, m, h;
  static int[][] tomatoes;
  static int[] moveR;
  static int[] moveC;

  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()); //col
    n = Integer.parseInt(st.nextToken()); //row
    h = Integer.parseInt(st.nextToken()); //height

    moveR = new int[]{-n, n, 0, 0, -1, 1}; //up, down, left, right, front, back
    moveC = new int[]{0, 0, -1, 1, 0, 0};

    tomatoes = new int[n*h][m];
    Queue<int[]> curTomato = new LinkedList<>(); // {r, c, day}
    int cntZero = 0;

    for(int j = 0; j < n * h; j++){
      st = new StringTokenizer(br.readLine());
      for(int k = 0; k < m; k++){
        tomatoes[j][k] = Integer.parseInt(st.nextToken());
        if(tomatoes[j][k] == 1) {
          curTomato.add(new int[]{j, k});
        }
        else if(tomatoes[j][k] == 0){
          cntZero++;
        }
      }
    }

    int answer = 0;

    while(!curTomato.isEmpty()){
      int[] cur = curTomato.poll();
      int curR = cur[0];
      int curC = cur[1];
      int curDay = tomatoes[curR][curC];
      answer = curDay;
      // move next index
      for(int i = 0; i < 6; i++){
        int nr = curR + moveR[i];
        int nc = curC + moveC[i];
        // 2차원배열로 설정했으므로 층이 다른데 이동할 수 있는 경우가 생김
        if(curR % n == n-1 && nr % n == 0) continue;
        // 반대
        if(curR % n == 0 && nr % n == n-1) continue;
        int nDay = curDay + 1;
        if(0<=nr && nr<n*h && 0<=nc && nc<m){
          if(tomatoes[nr][nc] != 0) continue;
          tomatoes[nr][nc] = nDay;
          curTomato.add(new int[]{nr, nc});
          cntZero--;
        }
      }
    }

    System.out.println(cntZero == 0 ? answer-1 : -1);
  }
}
profile
step by step...my devlog

0개의 댓글