Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Spring Boot
- 쿠버네티스
- 코드업
- DFS
- Kafka
- 로드밸런서
- 오일러프로젝트
- 클라우드 컴퓨팅
- 스프링
- aws
- 백트래킹
- 인천여행
- Elasticsearch
- 월미도
- 알고리즘
- 스프링부트
- Docker
- 백준
- gcp
- springboot
- 카프카
- Apache Kafka
- 자료구조
- 프로그래밍문제
- VPC
- Spring Data JPA
- 스프링 부트
- JPA
- Spring
- 클라우드
Archives
- Today
- Total
GW LABS
[Backjoon] 토마토 본문
그래프 탐색문제에서는 어떤 방식으로 탐색해야 문제를 빠르게 풀 수 있을지 판단하는 것이 문제의 관건이다. 7576번 토마토 문제는 DFS보다 BFS로 푸는 것이 좀 더 빠르고 쉽게 해결할 수 있는 방법이었다. 문제의 핵심은 그래프를 탐색하기 전에 탐색을 해야하는 위치를 미리 큐에 넣어두고 탐색을 시작하는 것이다. 아래는 파이썬 풀이이다.
import sys
from collections import deque
answer = 0
def print_table(tomato_table):
print()
for row in range(row_count):
for col in range(col_count):
print(tomato_table[row][col], end=" ")
print()
def bfs(tomato_positions, day, tomato_table, days):
q = deque(tomato_positions)
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
while q:
r, c = q.popleft()
tomato_table[r][c] = 1
global answer
answer = max(answer, days[r][c])
for idx in range(4):
row_next = r + dy[idx]
col_next = c + dx[idx]
if 0 <= row_next < len(tomato_table) and 0 <= col_next < len(tomato_table[0]) and tomato_table[row_next][col_next] == 0 and days[r][c] > days[row_next][col_next]:
days[row_next][col_next] = days[r][c] + 1
q.append([row_next, col_next])
if __name__ == "__main__":
col_count, row_count = list(map(int, sys.stdin.readline().split(" ")))
tomato_table = []
for _ in range(row_count):
tomato_table.append(list(map(int, sys.stdin.readline().split(" "))))
days = [[-1 for _ in range(col_count)] for _ in range(row_count)]
# 토마토의 위치 저장
tomato_positions = []
for row in range(row_count):
for col in range(col_count):
if tomato_table[row][col] == 1:
tomato_positions.append([row, col])
days[row][col] = 0
bfs(tomato_positions, 0, tomato_table, days)
# 익지 않은 토마토 탐색
for row in range(row_count):
for col in range(col_count):
if tomato_table[row][col] == 0:
print(-1)
quit()
print(answer)
또한 방문처리만을 위한 배열을 사용하지 않을 때에는 중복방문에 주의해야한다. 위의 소스에서는 days라는 배열에 토마토가 익기까지의 날짜를 기록하고 있는데, 토마토의 위치를 저장할 때 날짜를 0으로 세팅해줘야 중복방문 문제를 해결할 수 있다.
'Algorithm & DataStructure' 카테고리의 다른 글
C++로 구현하는 자료구조 (9) - Trie (0) | 2020.10.28 |
---|---|
C++로 구현하는 자료구조 (8) - Heap (0) | 2020.10.21 |
C++로 구현하는 자료구조 (7) - Queue (0) | 2020.10.13 |
C++로 구현하는 자료구조 (6) - Stack (0) | 2020.10.07 |
[Backjoon] 뱀 (0) | 2020.10.06 |
Comments