상세 컨텐츠

본문 제목

파이썬으로 풀어보는 백준 7569번: 토마토

Python/문제풀이

by 코딩하는 낙타 2020. 1. 30. 16:53

본문

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

 

7569번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100, 1 ≤ H ≤ 100 이다. 둘째 줄부터는 가장 밑의 상자부터 가장 위의 상자까지에 저장된 토마토들의 정보가 주어진다. 즉, 둘째 줄부터 N개의 줄에는 하나의 상자에 담긴 토마토의 정보가 주어진다. 각 줄에는 상자 가로줄에 들어있는 토마

www.acmicpc.net

 

내 풀이:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
M, N, H = map(int,input().split())
field = []
check = []
for _ in range(H):
    table = []
    for __ in range(N):
        a = list(map(int,input().split()))
        table.append(a)
        for idx, value in enumerate(a):
            if value == 1:
                check.append([_, __, idx])
    field.append(table)
if check == []:
    print("0")
    exit()
new_check = []
cnt = 0
while True:
    for h, i, j in check:
        if j-1 >= 0:
            if field[h][i][j-1== 0:
                field[h][i][j-1= 1
                new_check.append([h, i, j-1])
        if j+1 <= M-1:        
            if field[h][i][j+1== 0:
                field[h][i][j+1= 1
                new_check.append([h, i, j+1])
        if i-1 >= 0:
            if field[h][i-1][j] == 0:
                field[h][i-1][j] = 1
                new_check.append([h, i-1, j])
        if i+1 <= N-1:
            if field[h][i+1][j] == 0:
                field[h][i+1][j] = 1
                new_check.append([h, i+1, j])
        if h-1 >= 0:
            if field[h-1][i][j] == 0:
                field[h-1][i][j] = 1
                new_check.append([h-1, i, j])
        if h+1 <= H-1
            if field[h+1][i][j] == 0:
                field[h+1][i][j] = 1
                new_check.append([h+1, i, j])
    
    if new_check == []:
        TFTF = False
        for h in range(H):
            for i in range(N):
                for j in range(M):
                    if field[h][i][j] == 0:
                        TFTF = True 
        break
 
    check = new_check[:]
    new_check = []
    cnt += 1
 
if TFTF:
    print("-1")
 
else:
    print(cnt)
 

Python3, 3220ms

처음에는 모든 구역을 반복해서 검사를 했더니 시간초과가 났다. 때문에 새로 익은 토마토를 계속해서 리스트에 새로 담아 새로 익은 토마토을 기준으로 반복 검사하게 코드를 변경하였다.

관련글 더보기

댓글 영역