1. 문제
홍준이는 미로 안의 한 칸에 남쪽을 보며 서있다. 미로는 직사각형 격자모양이고, 각 칸은 이동할 수 있거나, 벽을 포함하고 있다. 모든 행과 열에는 적어도 하나의 이동할 수 있는 칸이 있다. 홍준이는 미로에서 모든 행과 열의 이동할 수 있는 칸을 걸어다녔다. 그러면서 자신의 움직임을 모두 노트에 쓰기로 했다. 홍준이는 미로의 지도를 자기 노트만을 이용해서 그리려고 한다.
입력으로 홍준이가 적은 내용을 나타내는 문자열이 주어진다. 각 문자 하나는 한 번의 움직임을 말한다. ‘F’는 앞으로 한 칸 움직인 것이고, ‘L'과 ’R'은 방향을 왼쪽 또는 오른쪽으로 전환한 것이다. 즉, 90도를 회전하면서, 위치는 그대로인 것이다.
2. 입력
첫째 줄에 홍준이가 적은 내용의 길이가 주어진다. 길이는 0보다 크고, 50보다 작다. 둘째 줄에 홍준이가 적은 내용이 내용이 주어진다.
5
RRFRF
14
LFLFRRFLFRRFLF
31
FRFFFFFFLLFRFFFFFLLFRFFFFLFFLFF
3. 출력
첫째 줄에 미로 지도를 출력한다. ‘.’은 이동할 수 있는 칸이고, ‘#’는 벽이다.
..
.#
#.#
...
#.#
######.
.......
#.#####
#.#...#
#.###.#
#.....#
#.#####
4. 코드
import sys
n = int(sys.stdin.readline())
str = list(sys.stdin.readline().rstrip())
turnX, turnY = [0,1,0,-1], [1,0,-1,0]
xList,yList = [0],[0]
# 이동가능한 좌표, 방향
x,y,t = 0,0,1
# 이동가능한 좌표 세팅
for s in str:
if s == 'R':
t = (t+1)%4
elif s == 'L':
t = (t-1)%4
else:
x, y = x + turnX[t], y + turnY[t]
xList.append(x)
yList.append(y)
minX, minY = min(xList), min(yList)
xLen, yLen = (max(xList)-minX+1), (max(yList)-minY+1)
# 초기 map 선언
map = [['#'] * yLen for _ in range(xLen)]
# x 최소값 세팅
if minX < 0:
minX = abs(minX)
else:
minX = 0
# y 최소값 세팅
if minY < 0:
minY = abs(minY)
else:
minx = 0
for x, y in zip(xList, yList):
map[x+minX][y+minY] = '.'
for m in map:
print("".join(m))
5. 풀이설명
① 변수 n과 방향 문자열 str을 입력받는다.
② 방향 좌표 turnX, turnY/ 좌표 리스트 xList, yList / 좌표와 방향 x,y,t를 선언한다.
③ 방향문자열 만큼 반복문을 싱행한다.
- s가 'R'인 경우
t에 (t+1) %4 를 대입하여 방향좌표를 변경한다.
- s가 'L'인 경우
t에 (t-1) %4 를 대입하여 방향좌표를 변경한다.
- s가 'F'인 경우
x,y에 turnX[t], turnY[y] 를 더한다.
좌표리스트 xList와 yList에 각각 x와 y를 추가한다.
④ xList와 yList의 최소값을 minX와 minY에 대입한다.
⑤ xList 최대값 - xList 최소값 + 1, yList 최대값 - yList 최소값 + 1을 xLen, yLen에 대입하여 미로의 가로, 세로 길이를 구한다.
⑥ ⑤에서 구한 가로, 새로 길이의 #로 이루어진 배열 map을 생성한다.
⑦ x,y 좌표 값이 음수일 경우 각 좌표에 더할 값을 구한고(최소값의 절대값) 양수일 경우 0을 대입한다.
⑧ map의 좌표중 xList와 yList에 추가한 좌표의 값을 .로 변경한다.
⑨ 배열 map을 결과값으로 출력한다.
6. 느낀점
처음부터 막혔던 문제라 구글링을 해서 풀었다. -1%4가 3이 나온다는 사실과 개수가 동일한 리스트등의 요소를 묶어주는 zip 함수를 배우게 되었다.
'알고리즘 > 문제풀이' 카테고리의 다른 글
구현(새끼치기/S2) - 17291번 (0) | 2023.01.28 |
---|---|
구현(늑대와 올바른 단어/S2) - 13022번 (0) | 2023.01.26 |
구현(별 찍기 - 23/S3) - 13015번 (0) | 2023.01.22 |
구현(세훈이의 선물가게/S1) - 17225번 (0) | 2023.01.15 |
구현(졸려/S1) - 9519번 (0) | 2022.12.15 |