Baekjoon

Baekjoon 7569번 토마토

ppwag 2020. 8. 17. 21:41

문제

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

걸린 시간

-

풀이

C++

#include <stdio.h>
#include <iostream>
#include <tuple>
#include <queue>
using namespace std;

int main(){
    int M, N, H;
    scanf("%d %d %d", &M, &N, &H);
    int warehouse[H][N][M];
    queue<tuple<int, int, int>> q;
    for(int h = 0; h < H; h++){
        for(int r = 0; r < N; r++){
            for(int c = 0; c < M; c++){
                cin >> warehouse[h][r][c];
                if(warehouse[h][r][c] == 1){
                    q.push(make_tuple(h, r, c));
                }
            }
        }
    }

    // bfs
    int dx[6] = {0, 0, -1, 1, 0, 0};
    int dy[6] = {1, -1, 0, 0, 0, 0};
    int dz[6] = {0, 0, 0, 0, 1, -1};

    tuple<int, int, int> tmp;
    int nx, ny, nz;
    int x, y, z;
    int result = -1;
    while(q.size() != 0){
        result += 1;
        int size = q.size();
        for(int i = 0; i < size; i++){
            tmp = q.front();
            q.pop();
            z = get<0>(tmp);
            x = get<1>(tmp);
            y = get<2>(tmp);
            for(int j = 0; j < 6; j++){
                nz = z+dz[j];
                nx = x+dx[j];
                ny = y+dy[j];
                if(0 <= nx && nx < N && 0 <= ny && ny < M && 0 <= nz && nz < H){
                    if(warehouse[nz][nx][ny] == 0){
                        warehouse[nz][nx][ny] = 1;
                        q.push(make_tuple(nz, nx, ny));
                    }
                }
            }
        }
    }

    // 익지 않은 토마토가 있다면
    for(int h = 0; h < H; h++){
        for(int r = 0; r < N; r++){
            for(int c = 0; c < M; c++){
                if(warehouse[h][r][c] == 0){
                    printf("%d\n", -1);
                    return 0;
                }
            }
        }
    }

    printf("%d\n", result);

    return 0;
}

2차원 배열을 이용하는 7576번 토마토에서 3차원으로 확장된 문제이다.

C++ 로 언어를 바꾸고 나서 stl 사용법은 물론이고 기본적인 문법도 기억이 잘 안나 사용법을 열심히 구글링해가며 풀이했다.

이미 풀어봤던 문제이기 때문에 당연히 한번에 통과할 줄 알았지만 런타임 에러가 자꾸만 발생했다.

백준 질문 게시판을 통해 알아낸 결과, 배열을 초기화 할 때 행과 열 값을 바꿔적은 것이 런타임 에러의 원인이였다.

이 부분에서 실수를 했을 거라 전혀 생각하지 못했던 이유는 Python 에선 잘못된 범위를 참조할 경우 에러 메세지를 잘 출력해주는 반면 C++ 은 해당 위치의 쓰레기값을 가지고 그대로 오류없이 수행되어지기 때문이다.

'Baekjoon' 카테고리의 다른 글

Baekjoon 19572번 가뭄(Small)  (0) 2020.08.18
Baekjoon 1389번 케빈 베이컨의 6단계 법칙  (0) 2020.08.17
Baekjoon 9461번 파도반 수열  (0) 2020.08.17
Baekjoon 1260번 DFS와 BFS  (0) 2020.08.17
Baekjoon 11047번 동전 0  (0) 2020.08.16

댓글