문제 풀이/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);
        }
    }
}