[백준] 토마토 7569

Su-hyeon B·2022년 11월 22일
0

알고리즘 문제 풀이

목록 보기
49/70
post-custom-banner

2차원 토마토

문제

  • mnh의 토마토 상자
  • 하루가 되면 위 아래 왼쪽 오른쪽 앞 뒤 -> 6방향에 있는 토마토가 익는다.
  • 대각선의 토마토에는 영향을 주지 못한다.
  • 창고에 보관된 토마토들이 며칠이 지나면 모두 익게 되는지 그 최소 일수를 구하여라

입력

  • 2 ≤ M ≤ 100, 2 ≤ N ≤ 100, 1 ≤ H ≤ 100
  • 1: 익은 토마토
  • 0: 익지 않은 토마토
  • -1: 빈 공간

출력

  • 저장될 때부터 모든 토마토가 익어있었으면 0 출력
  • 토마토가 모두 익지 못하는 상황이면 -1 출력

예제 입력

5 3 2
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0

예제 출력

4

풀이

풀이 1

토마토 2차원문제에서 3차원으로 변경

#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second

int board[103][103][103]; //그림
int dist[103][103][103]; //dist : 이전노드 +1 = 걸리는 시간을 뜻함

//아래 오른쪽 위 왼쪽 아래층 위층
int dx[6]={1,0,-1,0,0,0};
int dy[6]={0,1,0,-1,0,0};
int dz[6]={0,0,0,0,-1,1};

int main (void){
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int n, m, h;
    cin >> m >>n>>h;
    queue<pair<pair<int, int>, int>> Q;
    
    
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            for(int k=0; k<h; k++){
                cin >> board[i][j][k];
                //익은 토마토는 큐에 push -> 방문 예정
                if(board[i][j][k]==1) Q.push({{i, j}, k});
                //익지 않은 토마토는 -1
                if(board[i][j][k]==0) dist[i][j][k]=-1;
            }
            
        }
    }
    
    //큐를 돌면서 방문하기
    while(!Q.empty()){
        //큐에서 하나씩 뽑아서 상하좌우로 인접한 칸에 익지 않은 토마토를 익히기
        auto cur = Q.front();
        Q.pop();
        
        for(int dir =0; dir<6; dir++){
            //다음 인덱스 계산
            int nx = cur.X.X + dx[dir];
            int ny = cur.X.Y + dy[dir];
            int nz = cur.Y + dz[dir];
            
            //해당 인덱스가 범위 내에 있는지 확인
            if(nx <0 || nx>=n || ny>=m || ny<0|| nz>=h || nz<0) continue;
            
            //방문한 경우는 pass
            if(dist[nx][ny][nz]>=0) continue;
            
            //다음 노드 dist 갱신
            dist[nx][ny][nz] = dist[cur.X.X][cur.X.Y][cur.Y]+1;
            Q.push({{nx, ny}, nz}); //다음으로 방문할 곳 저장
        }
    }
    
    int ans=0; //모든 토마토가 익어있으면 0, 모두 익지 못하는 상황이면 -1 출력
    
    //박스 상태 확인하기
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            for(int k=0; k<h; k++){
                //익지 않은 토마토가 존재하면
                if(dist[i][j][k] == -1){
                    cout <<-1; return 0;
                }
                ans = max(ans, dist[i][j][k]);
            }
            
        }
    }
    
    
    cout <<ans;
    
}


profile
ML/AI Engineer
post-custom-banner

0개의 댓글