백준 14940번

노영진·2023년 9월 28일

내 코드

import sys
from collections import deque
input = sys.stdin.readline


def BFS(table, start):
    q = deque([start])
    table[start[0]][start[1]] = 0
    while q:
        x, y = q.popleft()
        dx = [-1,1,0,0]
        dy = [0,0,-1,1]
        # 상하좌우
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if (0 <= nx < n) and (0 <= ny < m):
                if table[nx][ny] == 1:
                    table[nx][ny] = str(int(table[x][y]) + 1)
                    q.append((nx, ny))
    return table


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

# 시작 지점 찾기
for i in range(n):
    for j in range(m):
        if table[i][j] == 2:
            start = (i, j)

# BFS
BFS(table, start)

# 예외처리
for i in range(n):
    for j in range(m):
        if table[i][j] == 0:
            table[i][j] = "0"
        if table[i][j] == 1:
            table[i][j] = "-1"
    print(" ".join(table[i]))

간단한 BFS 문제들은 이제 금방 푸는 것 같다.

  1. input
    데이터 받아서 테이블 생성
  2. 시작 지점 찾기
    테이블을 전체 다 돌면서 시작점을 찾고 start 변수에 기록
  3. BFS
    - start 지점을 0 으로 초기화
    - 1이면 방문한 적이 없다고 판단
    - 방문한 적 없는 곳들을 돌아다니며 str(이전 정점의 값 + 1)을 기록
    (str로 타입을 바꿔준 이유는,
    1. 어차피 나중에 join함수 쓸 때 문자열이어야 하기 때문도 있고
    2. int 형으로 하면 시작점 바로 다음으로 방문한 곳은 1이 저장되어 방문하지 않은 것으로 처리되기 때문에 "1"로 구분하기 위함)
  4. 예외처리
    원래 방문하지 못하는 곳들과 탐색 후 방문하지 못한 부분 처리

0개의 댓글