문제 풀이/C#
[7569] - 토마토
Chamber
2022. 10. 1. 18:30
https://www.acmicpc.net/problem/7569
7569번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,
www.acmicpc.net
https://joe0617160.tistory.com/16
[7576] - 토마토
https://www.acmicpc.net/problem/7576 7576번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다...
joe0617160.tistory.com
문제 풀이
위 7576번 토마토문제에서 2차원 배열이 3차원 배열로 바뀐 것을 제외하면 다른게 없다.
using System;
using System.Collections.Generic;
using System.Text;
namespace Baekjoon.Gold
{
class _7569
{
static void Main(string[] args)
{
int[] n = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
//n[0]: 열, n[1]: 행, n[2]: 높이
int[,,] box = new int[n[2],n[1],n[0]];
//que(z, y, x)
Queue<(int, int, int)> que = new Queue<(int, int, int)>();
for (int i = 0; i < n[2]; i++)
{
for (int j = 0; j < n[1]; j++)
{
int[] arr = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
for (int k = 0; k<n[0]; k++)
{
box[i, j, k] = arr[k];
//일단 1넣기
if (box[i, j, k] == 1)
que.Enqueue((i, j, k));
}
}
}
int count = 0;
int[] z_updown = { -1, 1, 0, 0, 0, 0};
int[] updown = { 0, 0, -1, 1, 0, 0};
int[] leftrignt = { 0, 0, 0, 0, -1, 1 };
while (que.Count > 0)
{
(int, int, int) point = que.Dequeue();
for (int i = 0; i < 6; i++)
{
int z = point.Item1 + z_updown[i];
int y = point.Item2 + updown[i];
int x = point.Item3 + leftrignt[i];
//인덱스 값 벗어날 수 있으니 범위 설정
if ((z < n[2] && z >= 0) && (y< n[1] && y >= 0) && (x < n[0] && x >= 0))
{
//안익었으면 익게 만들고 큐에 넣기
if (box[z,y,x] == 0)
{
box[z,y,x] = box[point.Item1, point.Item2, point.Item3] + 1;
count = box[point.Item1, point.Item2, point.Item3];
que.Enqueue((z,y,x));
}
}
}
}
for (int i = 0; i < n[2]; i++)
{
for (int j = 0; j < n[1]; j++)
{
for(int k =0; k<n[0]; k++)
{
if(box[i,j,k] == 0)
{
count = -1;
break;
}
}
if (count == -1)
break;
}
if (count == -1)
break;
}
Console.WriteLine(count);
}
}
}