-
백준 7569: 토마토Algorithms 2020. 9. 22. 10:21
오늘은 백준 7569번 토마토 문제를 풀어보았어요. 백준에 토마토 문제가 하나 더 있는데, 그 문제는 2차원 상자이고, 이 문제는 3차원 상자의 탐색이라는 점에서 난이도가 조금 더 높다고 볼 수 있겠네요.
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