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))
'# Coding > # 백준' 카테고리의 다른 글
[백준 / 1389] 케빈 베이컨의 6단계 법칙 - Python (0) | 2021.04.02 |
---|---|
[백준 / 1422] 숫자의 신 - Python (0) | 2021.04.02 |
[백준 / 1238] 파티 - Python (0) | 2021.03.31 |
[백준 / 1182] 부분수열의 합 - Python (0) | 2021.03.29 |
[백준 / 1159] 농구 경기 - Python (0) | 2021.03.29 |