solved.ac 기준 Silver 2
구현 문제의 매력은 문제 속에서 모든 해답을 찾을 수 있기 때문에, 한 없이 꼬아서 낼 수 있다는 점이다. 아니면 요구사항을 대폭 늘려서 코드 생산 효율을 줄여버릴 수도 있다. 이를 격파해내기 위해 설계하는 과정을 보기 위해 어려운 구현 문제는 꼭 필요한 것 같다. 해당 문제는 노트에 움직이면서 미로를 그리는 형식이기 떄문에 출력이 매우 유동적이라는 점이다. 이 부분에서 유추해내 문제를 풀었다.
문제
홍준이는 미로 안의 한 칸에 남쪽을 보며 서있다. 미로는 직사각형 격자모양이고, 각 칸은 이동할 수 있거나, 벽을 포함하고 있다. 모든 행과 열에는 적어도 하나의 이동할 수 있는 칸이 있다. 홍준이는 미로에서 모든 행과 열의 이동할 수 있는 칸을 걸어다녔다. 그러면서 자신의 움직임을 모두 노트에 쓰기로 했다. 홍준이는 미로의 지도를 자기 노트만을 이용해서 그리려고 한다.
입력으로 홍준이가 적은 내용을 나타내는 문자열이 주어진다. 각 문자 하나는 한 번의 움직임을 말한다. ‘F’는 앞으로 한 칸 움직인 것이고, ‘L'과 ’R'은 방향을 왼쪽 또는 오른쪽으로 전환한 것이다. 즉, 90도를 회전하면서, 위치는 그대로인 것이다.
입력
첫째 줄에 홍준이가 적은 내용의 길이가 주어진다. 길이는 0보다 크고, 50보다 작다. 둘째 줄에 홍준이가 적은 내용이 내용이 주어진다.
출력
첫째 줄에 미로 지도를 출력한다. ‘.’은 이동할 수 있는 칸이고, ‘#’는 벽이다.
예제 입력 1
5
RRFRF
예제 출력 1
..
.#
예제 입력 2
6
LFFRFF
예제 출력 2
...
##.
##.
예제 입력 3
14
LFLFRRFLFRRFLF
예제 출력 3
#.#
...
#.#
정답 코드
N = int(input())
S = input()
mapArr = [['#'] * 150 for _ in range(150)]
nowX = 150 // 2
nowY = 150 // 2
mapArr[nowX][nowY] = '.'
minX = nowX
maxX = nowX
minY = nowY
maxY = nowY
d = [(1, 0), (0, -1), (-1, 0), (0, 1)]
nowD = 0
for s in S:
if s == 'R':
nowD += 1
nowD %= 4
elif s == "L":
nowD -= 1
if nowD < 0: nowD = 3
elif s == "F":
nowX += d[nowD][0]
nowY += d[nowD][1]
mapArr[nowX][nowY] = '.'
minX = min(nowX, minX)
maxX = max(nowX, maxX)
minY = min(nowY, minY)
maxY = max(nowY, maxY)
for i in range(minX, maxX+1):
print(''.join(mapArr[i][minY:maxY+1]))
우선 모든 입력 사항을 입력받고, 변수를 초기화 한다. 맵의 크기는 넉넉하게 작성한다. 한곳으로 최대 50번 전진이 가능하므로 양방향으로 50씩, 101정도의 크기면 되지만 그냥 넉넉히 150으로 잡았다. 그리고 현재 플레이어가 이동한 최대 범위를 저장할 변수들도 초기화 한다. 내가 이동했던 범위 까지만 출력해야하기 때문이다.
그 다음 입력한 내용에 따라 이동을 수행한다. 회전에서는 현재 보고 있는 방향만 전환해주고, F가 나오면 이동을 수행하며 자리를 '.'로 바꿔준다.
'BOJ' 카테고리의 다른 글
[Python] 백준 15645: 내려가기 2 (0) | 2024.06.30 |
---|---|
[Python] 백준 1326: 폴짝폴짝 (1) | 2024.06.28 |
[Python] 백준 21608: 상어 초등학교 (0) | 2024.04.13 |