[백준] 7576번 토마토 - 파이썬(Python)

2021. 2. 7. 16:45· 알고리즘/문제풀이
목차
  1. 문제 (링크)
  2. 나의 풀이
  3. 접근 방법 및 코드 설명
728x90
시간 제한 메모리 제한
1 초 256 MB

문제 (링크)

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

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

www.acmicpc.net

 

나의 풀이

from collections import deque

dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]

m, n = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(n)]

q = deque()
for i in range(n):
	for j in range(m):
    	if graph[i][j] == 1:
        	
            # 초기 토마토의 위치를 찾아서 미리 큐에 삽입
        	q.append((i, j))

# bfs 진행

while q:
	x, y = q.popleft()
    
    for i in range(4):
    	nx, ny = x + dx[i], y + dy[i]
        if 0 <= nx < n and 0 <= ny < m:
        	if graph[nx][ny] == 0:
            	q.append((ny, nx))
                graph[nx][ny] = graph[x][y] + 1

max_day = -1

for i in range(n):
	# bfs 후에도 익지 않은 토마토가 있다면
	if 0 in graph[i]:
    	max_day = -1
	
    # graph[i]의 최대일 수와 지금까지 기록된 최대일 수 비교
    max_day = max(max_day, max(graph[i]))
        break
        
# 아직 익지 않은 토마토가 있을 경우는 -1 출력        
if max_day == -1:
	print(max_day)

# bfs 시작을 1로 잡았으므로, 실제로 익는 시간은 최댓값 - 1
else:
	print(max_day -1)

 

접근 방법 및 코드 설명

처음엔 엄두도 못냈던 문제지만, bfs에 조금 익숙해지고 나니 생각보다 간단한 문제였다.

 

입력값으로 받아온 그래프 중에서 초기 토마토의 위치(값이 1인 경우)를 bfs를 위한 큐에 미리 넣어놓고, 해당 값들에서 시작하는 bfs를 진행해주면 된다.

 

이 문제 역시 방문여부를 visited 같은 변수를 따로 만들어 저장할게 아니라, 오로지 0일때만 bfs를 실행하도록 코드를 작성하여 이미 방문한 위치는 방문하지 않도록 지정해주었다.

 

처음에 도저히 방법을 몰랐던 최소 날짜를 구하는 방법 또한 최단 거리를 구한다는 개념으로써 graph[nx][ny]의 위치에 이전 값에 1을 더한 값을 저장해줌으로써 별 어려움 없이 날짜를 구할 수 있었다. 

저작자표시 (새창열림)

'알고리즘 > 문제풀이' 카테고리의 다른 글

[프로그래머스] 다리를 지나는 트럭 - 파이썬 (Python)  (0) 2021.04.06
[프로그래머스] 기능개발 - 파이썬(Python)  (0) 2021.02.19
[백준] 7562번 나이트의 이동 - 파이썬(Python)  (0) 2021.02.06
[백준] 2667번 단지번호붙이기 - 파이썬(Python)  (0) 2021.02.05
[백준] 1406번 에디터 - 파이썬(Python)  (1) 2021.02.03
  1. 문제 (링크)
  2. 나의 풀이
  3. 접근 방법 및 코드 설명
'알고리즘/문제풀이' 카테고리의 다른 글
  • [프로그래머스] 다리를 지나는 트럭 - 파이썬 (Python)
  • [프로그래머스] 기능개발 - 파이썬(Python)
  • [백준] 7562번 나이트의 이동 - 파이썬(Python)
  • [백준] 2667번 단지번호붙이기 - 파이썬(Python)
SeongOnion
SeongOnion
서버는 꺼지지 않아요
SeongOnion
조무래기 코딩
SeongOnion
전체
오늘
어제
  • 분류 전체보기 (166) N
    • 알고리즘 (81)
      • 이론 (8)
      • 문제풀이 (73)
    • 언어 (15)
      • Python (9)
      • JavaScript (1)
      • JAVA (5)
    • 데이터베이스 (5)
    • 프레임워크 (15)
      • Django (7)
      • Spring (8)
    • 그 외 공부 (37) N
      • 운영체제 (1)
      • 자료구조 (14)
      • 네트워크 (5)
      • CS (2)
      • 기타 (6) N
      • 트러블 슈팅 (9) N
    • 프로젝트 (0)
    • 개발자취 (8)
    • 회고 (3)
    • 주저리주저리 (1)
    • 기타 (비개발) (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • DP
  • 백준
  • 오픈소스
  • 트러블 슈팅
  • 회고
  • 컨트리뷰트
  • 웹
  • 정렬 알고리즘
  • Django
  • 개발자
  • 알고리즘
  • BFS/DFS
  • DRF
  • 이진탐색
  • BFS
  • 장고
  • 프로그래머스
  • 스택
  • spring
  • 그리디알고리즘
  • 데이터베이스
  • 자바
  • 코딩테스트
  • 큐
  • 브루트포스
  • 소수
  • 파이썬
  • 코딩
  • 에라토스테네스의 체
  • 투 포인터 알고리즘

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
SeongOnion
[백준] 7576번 토마토 - 파이썬(Python)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.