본문 바로가기

IT/Python

[백준] 1347번 미로 만들기 [Python] - 정렬

728x90

 

 

주어진 좌,우,직진 정보만으로 미로를 그리는 문제

지나간 길을 '.'로 표현하고,

벽은 그 길을 포함하는 가장 작은 직사각형만으로 '#'로 채우기

더보기

문제

홍준이는 미로 안의 한 칸에 남쪽을 보며 서있다. 미로는 직사각형 격자모양이고, 각 칸은 이동할 수 있거나, 벽을 포함하고 있다. 모든 행과 열에는 적어도 하나의 이동할 수 있는 칸이 있다. 홍준이는 미로에서 모든 행과 열의 이동할 수 있는 칸을 걸어다녔다. 그러면서 자신의 움직임을 모두 노트에 쓰기로 했다. 홍준이는 미로의 지도를 자기 노트만을 이용해서 그리려고 한다.

입력으로 홍준이가 적은 내용을 나타내는 문자열이 주어진다. 각 문자 하나는 한 번의 움직임을 말한다. ‘F’는 앞으로 한 칸 움직인 것이고, ‘L'과 ’R'은 방향을 왼쪽 또는 오른쪽으로 전환한 것이다. 즉, 90도를 회전하면서, 위치는 그대로인 것이다.

입력

첫째 줄에 홍준이가 적은 내용의 길이가 주어진다. 길이는 0보다 크고, 50보다 작다. 둘째 줄에 홍준이가 적은 내용이 내용이 주어진다.

출력

첫째 줄에 미로 지도를 출력한다. ‘.’은 이동할 수 있는 칸이고, ‘#’는 벽이다.

1347번: 미로 만들기 $($acmicpc.net$)$

 

방향 전환을 반영하기 위한 좌표 정보를 미리 만들어두고$($상하좌우$)$

이동할 때마다 좌표를 저장해서 미로 전체 크기를 구하고

미로를 '#'로 채운 다음 저장해둔 경로를 따라서 '.'을 채우기

import sys
sys.stdin.readline()

# 초기 세팅
direction = [(1, 0), (0, -1), (-1, 0), (0, 1)]  # 방향
d = 0       # 방향 인덱스
xs = [0]    # 좌표 초기값 (0,0)
ys = [0]    # 여기서 xs는 행, ys는 열 좌표 정보를 갖는 리스트입니다.
orders = sys.stdin.readline().strip()   # 명령 입력

# 명령 확인
for order in orders:
    # 방향 전환
    if order == "R":
        d += 1
    elif order == "L":
        d -= 1
    # F: 전진 할 때
    else:
        x, y = xs[-1], ys[-1]   # 현재 좌표
        dx, dy = direction[d%4] # 이동 방향
        xs.append(x + dx)       # 이동한 좌표
        ys.append(y + dy)

# 미로 작성
x0, y0 = min(xs), min(ys)       # 좌표 중 최솟값, 최댓값을 구해서
x1, y1 = max(xs), max(ys)
h, w = x1 - x0 + 1, y1 - y0 + 1 # 미로의 세로, 가로 길이 구하기

# 미로를 벽 "#"으로 채우기
A = [["#"]*w for _ in range(h)]

# 지나간 좌표들을 '.'으로 채우기
for x, y in zip(xs, ys):
    x -= x0     # 최솟값이 0,0이 되도록 좌표 보정
    y -= y0
    A[x][y] = '.'

# 미로 출력
for row in A:
    print(*row, sep="")

 

더보기

예제 입력 1 

5
RRFRF

예제 출력 1

.. .#

예제 입력 2 

6
LFFRFF

예제 출력 2 

...
##.
##.

예제 입력 3 

14
LFLFRRFLFRRFLF

예제 출력 3 

#.#
...
#.#

예제 입력 4 

19
FLFRFFRFFFRFFRFLFLL

예제 출력 4 

#..#
....
.##.
....

예제 입력 5 

31
FRFFFFFFLLFRFFFFFLLFRFFFFLFFLFF

예제 출력 5 

######.
.......
#.#####
#.#...#
#.###.#
#.....#
#.#####