[Python] [BOJ] 미로 만들기(1347)

긍정왕·2021년 7월 30일
1

Algorithm

목록 보기
59/69

💡 문제 해결

  1. 초기 위치와 바라보는 방향 설정 및 이동했던 좌표를 저장할 리스트를 생성
  2. 명령어를 하나씩 수행하며 위치 좌표와 방향을 변경하며 이동했던 좌표를 저장
  3. 이동하면서 찍힌 좌표의 최대값과 최소값의 차이로 최대 변의 길이를 계산
  4. 계산된 크기로 이차원배열을 생성 후 이동했던 좌표의 정보를 바탕으로 미로 완성
  5. 완성된 미로를 출력


🧾 문제 설명

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

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

문제보기



🖨 입출력



📝 풀이

dx, dy = [-1, 0, 1, 0], [0, 1, 0, -1]

command_length = int(input())
commands = input()

dir = 2
pos = [0, 0]
x_list = [0]
y_list = [0]
for command in commands:
    if command == 'L':
        dir = (dir - 1) % 4
    elif command == 'R':
        dir = (dir + 1) % 4
    elif command == 'F':
        x, y = pos
        nx, ny = x + dx[dir], y + dy[dir]
        x_list.append(nx)
        y_list.append(ny)
        pos = [nx, ny]

max_x, min_x, max_y, min_y = max(x_list), min(x_list), max(y_list), min(y_list)
N, M = max_x - min_x + 1, max_y - min_y + 1
start_x, start_y = abs(min_x), abs(min_y)
maze = [['#'] * M for _ in range(N)]
for x, y in zip(x_list, y_list):
    maze[start_x + x][start_y + y] = '.'

for line in maze:
    print("".join(line))

profile
Impossible + 땀 한방울 == I'm possible

0개의 댓글