티스토리 뷰
접근법
문제에서 '최소일수', '주변의 토마토들을 익힘' 이라는 말을 봐서 bfs 문제임을 알았다.
dfs를 쓰면 안되는 문제였다. 깊이 들어갈 일이 없기 때문이다.
대각선 방향은 영향을 주지 않는다고 하였는데,
만약 대각선 방향의 영향을 준다면 위 아래 양옆 위치를 넣는 리스트에 대각선 방향만 넣으면 된다.
문제를 통해 한줄한줄 설명하겠다.
풀이
# bfs 특 queue 사용하기
# deque 모듈 안쓰면 시간복잡도 박살남(pop(0)이 시간복잡도가 O(n)이고 popleft()가 O(1)이라고 함)
from collections import deque
m, n = map(int, input().split())
# 토마토 받아서 넣기. 이차원 리스트로 만들어질거.
matrix = [list(map(int, input().split())) for _ in range(n)]
# 좌표를 넣을거니까 []를 넣자.
queue = deque([])
# 방향 리스트. [dx[0], dy[0]]은 곧 [-1, 0]이고 이는 왼쪽으로 이동하는 위치이다.
# 그려보면 이해하기 편함
dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]
# 정답이 담길 변수
res = 0
# queue에 처음에 받은 토마토의 위치 좌표를 append 시킨다
# n과 m을 사용하는걸 헷갈리지 말아야 함!
for i in range(n):
for j in range(m):
if matrix[i][j] == 1:
queue.append([i, j])
# bfs 함수. 한번 들어가면 다 돌고 나오니까 재귀 할 필요 없음
def bfs():
while queue:
# 처음 토마토 좌표 x, y에 꺼내고
x, y = queue.popleft()
# 처음 토마토 사분면의 익힐 토마토들을 찾아본다.
for i in range(4):
nx, ny = dx[i] + x, dy[i] + y
# 해당 좌표가 좌표 크기를 넘어가면 안되고, 그 좌표에 토마토가 익지 않은채로 있어야 함(0).
if 0 <= nx < n and 0 <= ny < m and matrix[nx][ny] == 0:
# 익히고 1을 더해주면서 횟수를 세어주기
# 여기서 나온 제일 큰 값이 정답이 될 것임
matrix[nx][ny] = matrix[x][y] + 1
queue.append([nx, ny])
bfs()
for i in matrix:
for j in i:
# 다 찾아봤는데 토마토를 익히지 못했다면 -1 출력
if j == 0:
print(-1)
exit(0)
# 다 익혔다면 최댓값이 정답
res = max(res, max(i))
# 처음 시작을 1로 표현했으니 1을 빼준다.
print(res - 1)
구구절절 없는 버전
from collections import deque
m, n = map(int, input().split())
matrix = [list(map(int, input().split())) for _ in range(n)]
queue = deque([])
dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]
res = 0
for i in range(n):
for j in range(m):
if matrix[i][j] == 1:
queue.append([i, j])
def bfs():
while queue:
x, y = queue.popleft()
for i in range(4):
nx, ny = dx[i] + x, dy[i] + y
if 0 <= nx < n and 0 <= ny < m and matrix[nx][ny] == 0:
matrix[nx][ny] = matrix[x][y] + 1
queue.append([nx, ny])
bfs()
for i in matrix:
for j in i:
if j == 0:
print(-1)
exit(0)
res = max(res, max(i))
print(res - 1)
결과
피드백 대대대대대 환영
반응형
'Basic_Studies > 알고리즘 문제풀이' 카테고리의 다른 글
[프로그래머스] 숫자 문자열과 영단어 (js) (0) | 2021.11.18 |
---|---|
[JS] 프로그래머스 - 체육복 (0) | 2021.10.13 |
[알고리즘] LeetCode - 152 : Maximum Product Subarray (0) | 2021.03.30 |
[LeetCode] 121. Best Time to Buy and Sell Stock (0) | 2021.03.23 |
[파이썬] 백준 - 1463: 1로 만들기 (매우 자세한 해설 포함) (10) | 2021.02.20 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- NextJS
- dvd 효과
- 리액트 컴포넌트
- nextjs 스크롤
- css 글래스모피즘
- getserversideprops redirect
- 리액트 파라미터 넘기기
- Til
- bs4 크롤링
- 파이썬 flask
- next.js 리다이렉트
- 글래스모피즘 애니메이션 구현
- 백준 10989 파이썬
- react router
- 자바스크립트
- 파이썬 크롤링
- vscode venv
- 파이썬 정렬
- 10989 파이썬
- nuxt 공식문서 한글
- 움직이는 글래스모피즘
- 리액트 라우터
- nextjs 파라미터 넘기기
- 리액트 스크롤
- 카페음료테스트
- 화이팅
- css marquee
- 리액트
- 글래스모피즘 구현
- nuxt 공식문서
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함