티스토리 뷰

반응형
백준 1347번: 미로 만들기 (파이썬 풀이)

백준 1347번: 미로 만들기 (파이썬 풀이)


문제 개요


백준 1347번 "미로 만들기" 문제는 홍준이가 이동한 경로를 따라 최소한의 직사각형 미로 지도를 생성하는 문제입니다. 홍준이는 처음 **남쪽**을 바라보고 있으며, 주어진 명령에 따라 움직입니다. 그가 지나간 모든 칸은 '.'으로, 그렇지 않은 칸은 '#'으로 표시해야 합니다.



핵심 아이디어


이 문제를 해결하기 위해 다음과 같은 단계별 접근을 사용합니다.


1. 방향 및 좌표 관리


홍준이의 방향을 인덱스로 관리하고, 각 방향에 따른 좌표 변화량을 배열에 저장합니다. 홍준이는 처음 남쪽을 바라보므로, 이를 인덱스 0으로 설정하여 방향을 순환시킵니다.


        북 (index = 2)
        (0,-1)
서 (index = 1)           동 (index = 3)
   (-1,0)               (1,0)
        남 (index = 0)
        (0,1)
    

- dx, dy 배열: `dx = [0, -1, 0, 1]`, `dy = [1, 0, -1, 0]`

- 회전: 'R' 명령은 `index`를 1 증가시키고, 'L' 명령은 1 감소시킵니다. 인덱스가 0~3 범위를 벗어나지 않도록 모듈러 연산으로 처리합니다.


2. 이동 경로 시뮬레이션 및 기록


주어진 입력 문자열을 순회하며 홍준이의 이동을 시뮬레이션합니다. 'F' 명령 시 현재 방향에 맞게 좌표를 업데이트하고, 방문한 모든 좌표를 리스트에 기록합니다.


3. 미로 크기 결정 및 좌표 보정


기록된 모든 좌표를 탐색하여 최소 x, 최대 x, 최소 y, 최대 y 값을 찾습니다. 이 값들을 이용해 미로의 가로, 세로 길이를 결정합니다. 이 때, 음수 좌표가 배열 인덱스로 사용될 수 없으므로, 모든 좌표를 최소 x, 최소 y 값만큼 이동시켜 0 이상의 값으로 보정합니다.


4. 미로 지도 생성 및 출력


계산된 크기의 2차원 리스트를 생성하고, 기본값을 '#'으로 채웁니다. 이후, 보정된 방문 좌표에 해당하는 칸을 '.'으로 변경합니다. 마지막으로, 완성된 미로를 한 줄씩 출력합니다.



전체 코드 (Python)


N = int(input())
st = input()

arr = []
dx = [0, -1, 0, 1]
dy = [1, 0, -1, 0]
index = 0
current = [0, 0]
min_x = 0
max_x = 0
min_y = 0
max_y = 0

arr.append([current[0], current[1]])

for i in st:
    if i == 'R':
        if index == 3:
            index = 0
        else:
            index += 1
    elif i == 'L':
        if index == 0:
            index = 3
        else:
            index -= 1
    elif i == 'F':
        current[0] = current[0] + dx[index]
        current[1] = current[1] + dy[index]
        arr.append([current[0], current[1]])
        
        if current[0] > max_x:
            max_x = current[0]
        if current[0] < min_x:
            min_x = current[0]
        if current[1] > max_y:
            max_y = current[1]
        if current[1] < min_y:
            min_y = current[1]

col = max_x - min_x + 1
row = max_y - min_y + 1

miro = [['#' for _ in range(col)] for _ in range(row)]

for i in range(len(arr)):
    x = arr[i][0] - min_x
    y = arr[i][1] - min_y
    miro[y][x] = '.'

for i in range(row):
    a = ''
    for j in range(col):
        a += miro[i][j]
    print(a)


코드 해설


  • dx, dy: 남(0), 서(1), 북(2), 동(3) 순서의 방향 벡터를 저장합니다.
  • current: 홍준이의 현재 좌표를 나타내는 리스트입니다.
  • arr: 홍준이가 방문한 모든 좌표를 기록하는 리스트입니다.
  • min_x, max_x, min_y, max_y: 시뮬레이션 중 방문한 좌표의 최소/최대 값을 실시간으로 업데이트합니다.
  • `for i in st:`: 입력 문자열을 순회하며 'R', 'L', 'F' 명령을 처리합니다. 'F' 명령 시 현재 좌표를 업데이트하고 `arr`에 추가합니다.
  • `col`과 `row`: 최소/최대 좌표를 이용해 필요한 미로의 크기를 계산합니다.
  • `miro = [['#'] * col for _ in range(row)]`: 미로 지도를 `#`로 초기화합니다.
  • `for i in range(len(arr))`: `arr`에 저장된 모든 좌표를 순회하며 `.으로` 표시합니다. 이때 `min_x`, `min_y`를 빼서 **좌표를 보정**합니다.
  • 최종적으로 이중 루프를 통해 완성된 미로를 출력합니다.

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/09   »
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
글 보관함
반응형