본문 바로가기

# Coding/# 백준

[백준 / 1347] 미로 만들기 - Python

728x90
반응형

https://www.acmicpc.net/problem/1347

 

1347번: 미로 만들기

홍준이는 미로 안의 한 칸에 남쪽을 보며 서있다. 미로는 직사각형 격자모양이고, 각 칸은 이동할 수 있거나, 벽을 포함하고 있다. 모든 행과 열에는 적어도 하나의 이동할 수 있는 칸이 있다. 홍

www.acmicpc.net

<접근>

이중리스트로 그래프를 그린다. 현재 진행 방향과, 현재 좌표, 리스트의 크기를 가지고 그래프를 그린다. 만약 리스트의 범위를 벗어나는 곳을 방문하면 리스트의 크기를 늘리면서 그래프를 그린다.

<입력 및 변수>

N = int(input())
moves = input()

# 북 : 1, 동 : 2, 남 : 3, 서 : 4
direction = 3

cur_Row = 0
cur_Col = 0
len_Row = 1
len_Col = 1
graph = [['.']]

 

움직임의 개수 N을 입력받고, 다음 움직임을 moves에 저장한다. 

 

방향인 direction은 현재 진행할 방향이고, [북, 동, 남, 서] 순서로 [1, 2, 3, 4]를 해당한다

 

현재위치인 cur_Row, cur_Col을 ( 0, 0 )으로 설정하고, 현재 위치가 있으므로 Row와 Column의 길이는 1, 1이다. 그리고 현재 위치가 있으므로 이중 리스트로 [['.']]를 설정한다.

<실행 1>

for move in moves:
    if move == 'R':
        direction += 1
        if direction == 5:
            direction = 1

    elif move == 'L':
        direction -= 1
        if direction == 0:
            direction = 4

 

움직임 글자 하나하나를 받아온다. [북, 동, 남, 서] 순서로 [1, 2, 3, 4] 이므로 오른쪽으로 도는 R이 오면 1씩 방향을 증가시킨다. 만약 4번을 다 돌아 5가 된다면 다시 1로 설정한다. 마찬가지로 왼쪽으로 도는 L이 오면 1씩 감소시키고 0이 되면 다시 4로 설정한다.

<실행 2>

    else:
        if direction == 1:
            cur_Row -= 1
            # 위쪽으로 넘어갈 때
            if cur_Row == -1:
                len_Row += 1
                graph = [['#' for _ in range(len_Col)]]+graph
                cur_Row = 0

        elif direction == 2:
            cur_Col += 1
            # 오른쪽으로 넘어갈 때
            if cur_Col == len_Col:
                len_Col += 1
                for i in range(len_Row):
                    graph[i].append('#')

 

앞에서 R과 L의 경우를 봤으니 남은 F를 본다.

 

만약 방향이 1이면 북쪽으로 가므로 cur_Row를 1 감소시킨다. 그래프 안에서 움직일 수 있지만, 만약 맨 윗줄에서 위로 움직인 경우에는 값이 존재하지 않으므로 cur_Row가 -1이면 한 줄을 앞에 추가하기 위해서 len_Row를 1 증가시키고 graph앞에 이전 것과 같은 크기인 len_Col 만큼 '#'으로 이루어진 리스트를 앞에 넣는다. 그리고 현재 cur_Row가 -1을 가리키므로 새로 추가된 앞줄을 가리키게 하기 위해 0으로 설정해준다.

 

방향이 2인 경우 동쪽으로 가므로 cur_Col을 1 증가시킨다. 그래프 안에서 움직일 수 있지만, 오른쪽으로 넘어가는 경우 길이를 1칸 추가해주고, 모든 리스트의 끝에 '#'을 추가시켜준다. 이미 cur_Col은 다음 값을 가리키고 있었으므로 따로 설정할 필요는 없다.

<실행 3>

        elif direction == 3:
            cur_Row += 1
            # 아래로 넘어갈 때
            if cur_Row == len_Row:
                len_Row += 1
                graph.append(['#' for _ in range(len_Col)])

        elif direction == 4:
            cur_Col -= 1
            # 왼쪽으로 넘어갈 때
            if cur_Col == -1:
                len_Col += 1
                for i in range(len_Row):
                    graph[i] = ['#']+graph[i]
                cur_Col = 0

        if graph[cur_Row][cur_Col] == '#':
            graph[cur_Row][cur_Col] = '.'

 

만약 방향이 3인 경우 남쪽으로 간다. 따라서 cur_Row를 1 증가시키는데, 그래프 안에서 움직일 수도 있지만 아닌 경우 리스트를 추가해준다. 따라서 len_Row를 1 증가시키고, len_Col의 길이의 '#'으로 이루어진 리스트를 끝에 추가해준다.

 

방향이 4인 경우 서쪽으로 간다. 따라서 cur_Row를 1 감소시키는데, 리스트의 범위를 왼쪽으로 넘어갈 수 있다. 즉, -1이 되는 경우 모든 리스트를 돌면서 왼쪽에 '#'을 추가시켜준다. 그리고 cur_Col이 지금 새로 추가됐음에도 -1을 가리키므로 0으로 설정해준다.

 

F는 해당 방향으로 전진이므로 이전에서 이미 cur_Row와 cur_Col을 바꿨으므로 해당 좌표에서 '#'으로 되어있다면 '.'으로 바꿔준다.

<출력>

for i in graph:
    print(''.join(i))

 

리스트를 순서대로 돌면서 공백없이 출력한다.

 

<전체 코드>

N = int(input())
moves = input()

# 북 : 1, 동 : 2, 남 : 3, 서 : 4
direction = 3

cur_Row = 0
cur_Col = 0
len_Row = 1
len_Col = 1
graph = [['.']]

for move in moves:
    if move == 'R':
        direction += 1
        if direction == 5:
            direction = 1

    elif move == 'L':
        direction -= 1
        if direction == 0:
            direction = 4

    else:
        if direction == 1:
            cur_Row -= 1
            # 위쪽으로 넘어갈 때
            if cur_Row == -1:
                len_Row += 1
                graph = [['#' for _ in range(len_Col)]]+graph
                cur_Row = 0

        elif direction == 2:
            cur_Col += 1
            # 오른쪽으로 넘어갈 때
            if cur_Col == len_Col:
                len_Col += 1
                for i in range(len_Row):
                    graph[i].append('#')

        elif direction == 3:
            cur_Row += 1
            # 아래로 넘어갈 때
            if cur_Row == len_Row:
                len_Row += 1
                graph.append(['#' for _ in range(len_Col)])

        elif direction == 4:
            cur_Col -= 1
            # 왼쪽으로 넘어갈 때
            if cur_Col == -1:
                len_Col += 1
                for i in range(len_Row):
                    graph[i] = ['#']+graph[i]
                cur_Col = 0

        if graph[cur_Row][cur_Col] == '#':
            graph[cur_Row][cur_Col] = '.'

for i in graph:
    print(''.join(i))
728x90
반응형