일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 파이썬
- 파이썬 #백준 #알고리즘 #코딩테스트
- 프로그래머스 #파이썬 #코딩테스트 #알고리즘
- dp
- 백준 #알고리즘 #파이썬 #코딩테스트
- java #자바 #생활코딩
- 백트랙킹
- 백준 #파이썬 #알고리즘 #코딩테스트
- 재귀
- 파이썬 #알고리즘 #코딩테스트 #프로그래머스
- 투포인터
- 다익스트라
- java #자바 #동빈나
- 코딩테스트
- react #리액트 #동빈나 #나동빈 #유튜브강의
- 프로그래머스
- 자바 #java
- DFS
- react #리액트 #동빈나
- 다이나믹프로그래밍
- java #자바
- 프로그래머스 #파이썬 #알고리즘 #코딩테스트
- PYTHON
- 백준
- 알고리즘
- BFS
- css #생활코딩 #웹
- java #자바 #나동빈
- css #웹 #생활코딩
- Dijkstra
- Today
- Total
커리까지
[백준] 17129번 윌리암슨수액빨이딱따구리가 정보섬에 올라온 이유 파이썬 본문
문제
윌리암슨수액빨이딱따구리 세 식구가 정보섬에 올라왔다!
세 윌리암슨수액빨이딱따구리는 정보섬 2층 어딘가에 모여 앉아 쉬고 있었는데, 저 멀리 청국장과 스시와 맥앤치즈가 있는 것을 발견했다! 아빠는 청국장, 엄마는 스시, 아이는 맥앤치즈가 먹고 싶다. 그래서 이 셋은 현위치로부터 가장 가까운 음식을 먹으러 가기로 했다.
정보섬 2층은 An×m의 격자로 표현된다. 어떤 Ai,j가 0이면 빈 복도여서 지나갈 수 있고, 1이면 장애물로 막혀 지나갈 수 없다. 윌리암슨수액빨이딱따구리 식구는 2, 청국장은 3, 스시는 4, 맥앤치즈는 5이다. 윌리암슨수액빨이딱따구리는 단위 시간마다 한 칸, 상하좌우로 움직일 수 있다. 2, 3, 4, 5는 장애물이 아니므로 지나갈 수 있다. 격자 밖으로는 나갈 수 없으며 시작점으로부터 시작점까지의 거리는 0이다. 시작점은 윌리암슨수액빨리딱따구리의 위치, 즉 2의 위치이다.
과연 윌리암슨수액빨이딱따구리 식구는 어떤 음식에 더 빨리 도착할 수 있을까?
입력
첫째 줄에 정보섬 2층의 크기 n과 m이 주어진다. (1 ≤ n,m ≤ 3000, 4 ≤ n×m ≤ 9×106)
이후 n행 m열에 걸쳐 0, 1, 2, 3, 4, 5로만 구성된 Ai,j가 주어진다. Ai,j와 Ai,j+1사이에 공백은 주어지지 않는다.
2, 3, 4, 5는 반드시 하나씩 존재하며 2, 3, 4, 5가 아닌 나머지는 0 또는 1이다.
출력
첫째 줄에 "TAK"(폴란드어로 YES를 의미)을 출력하고, 둘째 줄에 현위치에서 가장 빨리 도착할 수 있는 음식까지의 최단 거리를 출력한다.
아무 음식도 먹을 수 없으면 "NIE"(폴란드어로 NO를 의미)를 출력한다. 이외의 출력은 하지 않는다.
TAK과 NIE를 출력할 때 따옴표는 출력하지 않으며 반드시 대문자로 출력한다.
예제 입력 1
3 3
200
003
045
예제 출력 1
TAK
3
예제 입력 2
3 3
210
113
045
예제 출력 2
NIE
제출 답안
from collections import deque
import sys
input = sys.stdin.readline
dy = [0, 1, 0, -1]
dx = [1, 0, -1, 0]
n, m = map(int, input().split())
graph = [list(map(int, input().strip())) for _ in range(n)]
visited = [[0] * m for _ in range(n)]
def bfs(y, x):
q = deque([(y, x)])
visited[y][x] += 1
while q:
y, x = q.popleft()
for i in range(4):
ny = y + dy[i]
nx = x + dx[i]
if 0 <= ny < n and 0 <= nx < m:
if not visited[ny][nx] and graph[ny][nx] != 1:
visited[ny][nx] = visited[y][x] + 1
q.append((ny, nx))
if graph[ny][nx] in [3, 4, 5]:
print("TAK")
print(visited[y][x])
exit()
print("NIE")
for y in range(n):
for x in range(m):
if graph[y][x] == 2:
bfs(y, x)
'알고리즘 > 풀이' 카테고리의 다른 글
[백준] 15723번 n단 논법 파이썬 (0) | 2023.08.11 |
---|---|
[백준] 15900번 나무 탈출 파이썬 (0) | 2023.08.05 |
[백준] 2468번 안전 영역 파이썬 (0) | 2023.08.04 |
[백준] 18404번 현명한 나이트 파이썬 (0) | 2023.08.04 |
[백준] 16174번 점프왕 쩰리(Large) 파이썬 (0) | 2023.08.03 |