본문 바로가기
문제 풀이/[BaekJoon]

[BaekJoon] 17114 하이퍼 토마토 (Gold 1) - Python

by 조랩 2023. 2. 7.

문제

 

시프트의 토마토 농장은 아래 그림과 같이 토마토를 보관하는 큰 11차원 창고를 가지고 있다. 창고는 m × n × o × p × q × r × s × t × u × v × w 의 격자 모양이고, 각 칸에 토마토를 하나씩 보관할 수 있다.

 

 

창고에 보관되는 토마토들 중에는 잘 익은 것도 있지만, 아직 익지 않은 토마토들도 있을 수 있다. 보관 후 하루가 지나면, 익은 토마토들의 인접한 곳에 있는 익지 않은 토마토들은 익은 토마토의 영향을 받아 익게 된다. 하나의 토마토에 인접한 곳은 [±10000000000], [0±1000000000], [00±100000000], [000±10000000], [0000±1000000], [00000±100000], [000000±10000], [0000000±1000], [00000000±100], [000000000±10], [0000000000±1]의 스물 두 방향에 인접해 있는 토마토를 의미한다. 토마토가 혼자 저절로 익는 경우는 없다고 가정한다. 시프트는 창고에 보관된 토마토들이 며칠이 지나면 다 익게 되는지 그 최소 일수를 알고 싶어 한다.

m, n, o, p, q, r, s, t, u, v, w 와 익은 토마토들과 익지 않은 토마토들의 정보가 주어졌을 때, 며칠이 지나면 토마토들이 모두 익는지, 그 최소 일수를 구하는 프로그램을 작성하라. 단, 창고의 일부 칸에는 토마토가 들어있지 않을 수도 있다.


입출력 예시

 

입력: 첫 줄에는 문제의 설명에서 창고의 크기를 나타내는 자연수 m, n, o, p, q, r, s, t, u, v, w가 주어진다. 단, 1 ≤ mnopqrstuvw ≤ 106 이다.

둘째 줄부터는 창고에 저장된 토마토들의 정보가 주어진다. 창고 안의 격자 공간을 (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)부터 (m, n, o, p, q, r, s, t, u, v, w)까지의 좌표로 나타낸다고 하면,

  • 둘째 줄에는 (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)부터 (m, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)까지에 들어 있는 토마토 m개의 정보가 주어지고,
  • 이러한 줄이 n번 반복되어  (1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)부터 (m, n, 1, 1, 1, 1, 1, 1, 1, 1, 1)까지에 들어 있는 토마토 mn개의 정보가 주어지고,
  • 이러한 n개의 줄이 o번 반복되어 (m, n, o, 1, 1, 1, 1, 1, 1, 1, 1)까지에 들어 있는 토마토 mno개의 정보가 주어지고,
  • 이러한 no개의 줄이 p번 반복되어 (m, n, o, p, 1, 1, 1, 1, 1, 1, 1)까지에 들어 있는 토마토 mnop개의 정보가 주어지고,
  • ⋯ 이와 같은 방법으로 nopqrstuvw개의 줄에 걸쳐 (m, n, o, p, q, r, s, t, u, v, w)까지에 들어 있는 토마토 mnopqrstuvw개의 정보가 모두 주어진다.

정수 1은 익은 토마토, 정수 0은 익지 않은 토마토, 정수 -1은 토마토가 들어있지 않은 칸을 나타낸다.

출력: 토마토가 모두 익을 때까지 최소 며칠이 걸리는지를 계산해 출력한다. 만약 저장될 때부터 모든 토마토가 익어있는 상태이면 0을 출력해야 하고, 토마토가 모두 익지는 못하는 상황이면 -1을 출력해야 한다.

 

입력예시1)

6 4 1 1 1 1 1 1 1 1 1
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 1

출력예시1)

8

 

입력예시2)

5 3 1 1 1 1 1 1 1 1 1
0 -1 0 0 0
-1 -1 0 1 1
0 0 0 1 1

출력예시2)

-1

 

입력예시3)

5 3 2 1 1 1 1 1 1 1 1
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

출력예시3)

4

코드

 

a, b, c, d, e, f, g, h, i, j, k = map(int, input().split()) # 11차원 크기 입력,,
 
grid = [[[[[[[[[[list(map(int,input().split())) for _ in range(b)] for _ in range(c)] for _ in range(d)] for _ in range(e)] for _ in range(f)] for _ in range(g)] for _ in range(h)] for _ in range(i)] for _ in range(j)] for _ in range(k)] # 11차원 입력,,,
 
tomato = [] # 토마토 위치 저장 리스트 생성
for A in range(k):
    for B in range(j):
        for C in range(i):
            for D in range(h):
                for E in range(g):
                    for F in range(f):
                        for G in range(e):
                            for H in range(d):
                                for I in range(c):
                                    for J in range(b):
                                        for K in range(a):
                                            if grid[A][B][C][D][E][F][G][H][I][J][K] == 1:
                                                tomato.append((A,B,C,D,E,F,G,H,I,J,K)) # 토마토 추가,,
 
 # 이거 변화량
dK = [-1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
dJ = [0,0,-1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
dI = [0,0,0,0,-1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
dH = [0,0,0,0,0,0,-1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
dG = [0,0,0,0,0,0,0,0,-1,1,0,0,0,0,0,0,0,0,0,0,0,0]
dF = [0,0,0,0,0,0,0,0,0,0,-1,1,0,0,0,0,0,0,0,0,0,0]
dE = [0,0,0,0,0,0,0,0,0,0,0,0,-1,1,0,0,0,0,0,0,0,0]
dD = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1,0,0,0,0,0,0]
dC = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1,0,0,0,0]
dB = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1,0,0]
dA = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,1]
 
day = 0
result = 0
while True:
    new_tomato = []
    for A,B,C,D,E,F,G,H,I,J,K in tomato:
        for l in range(22):
            nA = A + dA[l]
            nB = B + dB[l]
            nC = C + dC[l]
            nD = D + dD[l]
            nE = E + dE[l]
            nF = F + dF[l]
            nG = G + dG[l]
            nH = H + dH[l]
            nI = I + dI[l]
            nJ = J + dJ[l]
            nK = K + dK[l]
            if 0<=nA<k and 0<=nB<j and 0<=nC<i and 0<=nD<h and 0<=nE<g and 0<=nF<f and 0<=nG<e and 0<=nH<d and 0<=nI<c and 0<=nJ<b and 0<=nK<a:
                if not grid[nA][nB][nC][nD][nE][nF][nG][nH][nI][nJ][nK]: # grid가 0이면
                    grid[nA][nB][nC][nD][nE][nF][nG][nH][nI][nJ][nK] = 1 # 1로 바꾸고
                    new_tomato.append((nA,nB,nC,nD,nE,nF,nG,nH,nI,nJ,nK)) # 추가
 
    if len(new_tomato):
        tomato = new_tomato[:]
        day += 1 # 하루 1 증가
    else:
        result = day
        for A in range(k):
            for B in range(j):
                for C in range(i):
                    for D in range(h):
                        for E in range(g):
                            for F in range(f):
                                for G in range(e):
                                    for H in range(d):
                                        for I in range(c):
                                            for J in range(b):
                                                for K in range(a):
                                                    if grid[A][B][C][D][E][F][G][H][I][J][K] == 0:
                                                        result = -1 # 아직 0인 칸이 있다면? 결과값은 -1
        break
 
print(result) # 결과값 출력

실행 화면


채점 결과

풀면서도 이게 맞나 싶었는데

다 풀고나니까 문제가 이게 맞나 싶네 ㅇㅁㅇ

728x90