ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 7569: 토마토
    Algorithms 2020. 9. 22. 10:21

    오늘은 백준 7569번 토마토 문제를 풀어보았어요. 백준에 토마토 문제가 하나 더 있는데, 그 문제는 2차원 상자이고, 이 문제는 3차원 상자의 탐색이라는 점에서 난이도가 조금 더 높다고 볼 수 있겠네요.

     

     

    www.acmicpc.net/problem/7569

     

    7569번: 토마토

    첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,

    www.acmicpc.net

     

    먼저 이 문제를 풀기 위해서 bfs로 접근을 해보았는데요, 토마토의 상태를 저장할 상자의 3차원 배열을 설정하고, 익은 토마토(1)들을 queue에 넣어 그 때부터 bfs를 해주며 하루에 한번씩 카운팅을 해주었어요.

     

    from sys import stdin
    from collections import deque
    
    def solution():
    
        def bfs(totZero):
            day = 0
            curZeroCnt = 0
            tomCnt = len(q)
            dirs = [(0,1,0),(0,-1,0),(0,0,1),(0,0,-1),(1,0,0),(-1,0,0)]
    
            if tomCnt < 1:
                return -1
                
            
            while q:
                
                tomCnt = len(q)
                for _ in range(tomCnt):
                    curH,curR,curC = q.popleft()
    
                    for d in dirs:
                        nh, nr, nc = curH+d[0], curR+d[1], curC+d[2]
                        if 0<=nh<h and 0<=nr<r and 0<=nc<c and box[nh][nr][nc] == 0:
                            curZeroCnt += 1
                            box[nh][nr][nc] = 1
                            q.append((nh,nr,nc))
    
                if not q:
                    if curZeroCnt == totZero:
                        return day
                    else:
                        return -1
                
                day += 1
    
            return day
    
    
                
        answer = 0
        q = deque()
    
        c, r, h = map(int, stdin.readline().split())
        box = [[list(map(int, stdin.readline().split())) for _ in range(r)] for _ in range(h)]
    
        # box[height][row][col]
        # dirs: (h, r, c)
        
        noZero = True
        zeroCnt = 0
        for hh in range(h):
            for rr in range(r):
                for cc in range(c):
                    if box[hh][rr][cc] == 1:
                        q.append((hh,rr,cc))
                    elif box[hh][rr][cc] == 0:
                        zeroCnt += 1
                        noZero = False
        
        if not noZero:
            answer= bfs(zeroCnt)
        
        return answer
    
    
    
    if __name__ == "__main__":
        print(solution())

    일단 제가 짠 코트는 이렇게 됩니다. 아직 코드를 깔끔하게 짜는 법을 배우고 있는 중이라서 코드가 조금 보기 힘드네요 ㅠㅠ 더 열심히 공부해야겠습니다!

    'Algorithms' 카테고리의 다른 글

    백준 1309: 동물원  (0) 2020.09.19
Designed by Tistory.