https://www.acmicpc.net/problem/14940
오랜만에 코테를 풀어보러 왔다.
어떤 문제를 풀까 하다가 solved.ac 클래스에 새롭게 선정된 문제를 선택했다.
쉽게쉽게 실버1로 선택하였지만 Python으로 풀어보는 코테는 처음이었다.
문제는 전혀 어렵지 않고 모든 지점에서부터 목적지의 최단거리를 구하는 것이다.
bfs를 수행하고 visit 배열을 출력하면 된다.
어려운 부분은 없었지만 출력 조건이 헷갈렸다.
우선 입력은 아래와 같다.
0: 갈 수 없는 땅
1: 갈 수 있는 당
2: 목적지
출력은
0: 원래 갈 수 없는 땅
-1: 도달할 수 없는 땅
나머지는 최단 거리이다.
각 경우만 잘 따지면 어렵진 않다. 오히려 국어가 어려웠던 문제.
import sys
import queue
def bfs():
dr = [0, 1, 0, -1]
dc = [1, 0, -1, 0]
q = queue.Queue()
q.put((x, y))
visit[x][y] = 0;
while(q.qsize()):
tmp = q.get()
for i in range(4):
nr = tmp[0] + dr[i]
nc = tmp[1] + dc[i]
if nr < 0 or nc < 0 or nr >= n or nc >= m: continue
if visit[nr][nc] > -1: continue
q.put((nr, nc))
visit[nr][nc] = visit[tmp[0]][tmp[1]] + 1
input = sys.stdin.readline
n, m = map(int, input().split())
arr = [list(map(int, input().split())) for _ in range(n)]
visit = [[-1] * m for _ in range(n)]
x, y = -1, -1
for i in range(n):
for j in range(m):
if arr[i][j] == 2:
x = i
y = j
if arr[i][j] == 0:
visit[i][j] = 0
bfs()
for i in range(n):
for j in range(m):
print(visit[i][j], end=' ')
print()

파이썬으로 대량의 입력을 받아본 경험이 없어서 입출력이 더 오래 걸렸던 문제.
파이썬은 배열도 한 번에 출력되잖아!? 하면서 print(visit) 해버린 탓에 오류 없는데 오류 찾느라 오래 걸린 문제...
머쓱,,, 이런 자잘한 실수로 다시 깨달아 가는거지...!
'Algorithm > BFS' 카테고리의 다른 글
| [C++] BOJ(백준) 3197 백조의 호수 (0) | 2024.01.15 |
|---|---|
| [C++] BOJ(백준) 16946 벽 부수고 이동하기 4 (0) | 2024.01.08 |
| [C++] BOJ(백준) 2234 성곽 (1) | 2024.01.05 |
| [C++] BOJ(백준) 2665 미로만들기 (0) | 2023.08.25 |
| [C++] BOJ(백준) 2310 어드벤처 게임 (0) | 2023.07.19 |