문제
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 |
댓글