SangYoonLee (SYL)
◆ Slow, But Steady ◆
SangYoonLee (SYL)
전체 방문자
오늘
어제
  • ◻ 전체 글 수 : (128)
    • ✪ 취미, 경험 회고 및 일상 (25)
      • [취미] Room Escape (2)
      • [회고] IT 관련 경험 회고 (17)
      • [일상] 일상 생각 (4)
      • [일상] 독후감 (1)
    • ◼ FrontEnd (27)
      • Web & HTML, CSS (8)
      • JavaScript (2)
      • TypeScript (1)
      • ReactJS (16)
    • ◼ CS (3)
      • 자료구조 & 알고리즘 (1)
      • 컴퓨터 구조 (1)
      • 운영체제 (1)
    • ◼ PS Note (40)
      • 백준 (38)
      • 프로그래머스 (2)
    • ◼ IT Etc. (33)
      • (Until 2021) (21)
      • Python (6)
      • C | C# | C++ (1)
      • Git (1)
      • Unity (4)
      • Game Dev. (0)

블로그 메뉴

  • 홈
  • 💻 GitHub
  • 🟢 Velog
  • 🧩 온라인 방탈출 출시 작품 모음

인기 글

최근 글

공지사항

반응형
hELLO · Designed By 정상우.
SangYoonLee (SYL)

◆ Slow, But Steady ◆

◼ PS Note/백준

[백준] 7576번 : 토마토 (🥇골드 5) (Python)

2023. 2. 22. 00:35
반응형

문제 바로 가기

 

7576번: 토마토

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

www.acmicpc.net

 


풀이

  • 사용 언어 : Python
  • 풀이한 날짜 : 2023-02-10
 
from collections import deque


# 입력값 처리 및 필요 변수 선언
m, n = tuple(map(int, input().split()))

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

visited = [
    [False] * m
    for _ in range(n)
]

days = [
    [0] * m
    for _ in range(n)
]

q = deque()


# (2차원) 배열 visited, days 추가 세팅
answer_0_flag = True

for r in range(n):
    for c in range(m):
        if box[r][c] == -1:
            visited[r][c] = True
            days[r][c] = -1
        if box[r][c] == 0:
            answer_0_flag = False


drs, dcs = [1, -1, 0, 0], [0, 0, 1, -1]


# BFS 및 관련 함수 선언
def in_range(r, c):
    return r >= 0 and r < n and c >= 0 and c < m

def can_go(r, c):
    return in_range(r, c) and not visited[r][c]

def bfs():
    while q:
        r, c = q.popleft()

        for dr, dc in zip(drs, dcs):
            nr, nc = r + dr, c + dc

            if can_go(nr, nc) and box[nr][nc] == 0:
                visited[nr][nc] = True
                days[nr][nc] += (days[r][c] + 1)
                box[nr][nc] = 1
                q.append((nr, nc))


# 토마토가 익는 과정 수행
for r in range(n):
    for c in range(m):
        if box[r][c] == 1:
            visited[r][c] = True
            days[r][c] = 0 # 없어도 되는 코드
            q.append((r, c))
bfs()


# 결과 분석
max_days = 0

def analyze_result():
    global max_days

    if answer_0_flag:
        return 0

    for r in range(n):
        for c in range(m):
            max_days = max(days[r][c], max_days)
            if box[r][c] == 0:
                return -1
    return max_days


print(analyze_result())

 

풀이 로직

  • 토마토 박스에서 토마토들이 익는 과정을 격자에서 숫자 1이 있는 칸부터 BFS 방법으로 탐색해나가는 과정이라 생각하고 문제를 풀었다.
  • 3개의 2차원 격자를 선언하고 풀었는데, 2개만 사용해도 풀 순 있을 것 같다.
  • 숫자가 1인 칸의 위치를 모두 큐 자료구조에 넣어주고, 칸의 상하좌우를 탐색하여 0이 있는 칸을 다음 탐색 대상으로 삼았다. (파이썬 특성 상 queue 대신 deque 자료구조를 선언해주었다)
    • 다음 칸을 탐색하는 시기는 토마도 박스로 치면 다음 날이 되었을 때이므로 이를 days 격자에 반영하였다.
  • 모든 칸을 탐색한 후 days 격자에 반영된 결과에 따라 올바른 답을 출력하도록 코드를 작성했다.
    • 처음 입력 받을 때 0인 칸이 없으면, 이미 모든 토마토가 익어있다는 의미이므로 바로 0을 출력한다.
    • 탐색이 끝난 후 0인 칸이 days 격자에 남아있으면, 토마토가 모두 익지 못하는 상태이므로 -1을 출력한다.
    • 위 경우가 모두 아니라면, days 격자에 있는 수들의 최댓값이 토마토가 모두 익을 때까지 걸린 최소 시간이므로, 격자를 순회하여 이 값을 찾아 출력한다.

 

문제 접근 과정 및 느낀점

  • BFS(너비 우선 탐색) 방법의 최단 거리 이동 문제 유형이라 생각하고 풀었다.
  • 와 미쳤다. 내가 백준 골드 문제를 푸는 날이 오는구나.
  • DFS/BFS를 코테 캠프 수업에서 학습한 후 관련 문제를 백준에서 찾아 한 번 풀어보았는데 이게 풀리네. (물론 디버깅도 오랜 시간 하면서 많이 헤맸지만)
  • 다만 그래프 탐색을 한 지점이 아닌 여러 지점에서 동시에 일어난다는 것이 헷갈렸던 부분이었는데, 큐 자료구조에 그냥 순서대로 탐색 지점의 위치를 넣어주면 되는 것이었다.

 

반응형

'◼ PS Note > 백준' 카테고리의 다른 글

[백준] 1012번 : 유기농 배추 (🥈실버 2) (Python)  (0) 2024.01.12
[백준] 1107번 : 리모컨 (🥇골드 5) (Python)  (2) 2024.01.10
[백준] 15650번 : N과 M (2) (🥈실버 2) (Python)  (0) 2023.02.22
[백준] 1929번 : 소수 구하기 (🥈실버 3) (Python)  (0) 2023.02.22
[백준] 1063번 : 킹 (🥈실버 4) (Python)  (0) 2023.01.22
    '◼ PS Note/백준' 카테고리의 다른 글
    • [백준] 1012번 : 유기농 배추 (🥈실버 2) (Python)
    • [백준] 1107번 : 리모컨 (🥇골드 5) (Python)
    • [백준] 15650번 : N과 M (2) (🥈실버 2) (Python)
    • [백준] 1929번 : 소수 구하기 (🥈실버 3) (Python)
    SangYoonLee (SYL)
    SangYoonLee (SYL)
    Slow, But Steady Wins The Race 😎

    티스토리툴바