실버2 문제라 그리 어렵지 않은 시뮬레이션 문제였다.
- 맵을 그릴 필요 없이 (0, 0) 위치에서 시작하여 문제에 주어진 조건 그대로 구현한다.
- L과 R의 경우는 방향만 바꿔준다.
- 이 때, 현재 방향을 각 경우별로 만들어놓은 방향 전환 리스트(dirL, dirR)를 참조하여 현 방향에 해당하는 인덱스로 바꾼다.
- F와 B의 경우는 현재 방향으로 한 칸 나아간다.
- 이 때, 이동한 위치를 min_r/c, max_r/c 최솟값과 최댓값 비교를 통해 계속 갱신해준다.
- 갱신된 최솟값 위치와 최댓값 위치를 이용해 최대 직사각형의 크기를 출력한다.
파이썬 코드는 다음과 같다.
import sys
input = sys.stdin.readline
dr = (-1, 1, 0, 0)
dc = (0, 0, -1, 1)
dirL = (2, 3, 1, 0)
dirR = (3, 2, 0, 1)
T = int(input())
for _ in range(T):
A = input()
min_r, min_c, max_r, max_c = 0, 0, 0, 0
r, c, d = 0, 0, 0 # 현재 위치/방향
for cmd in A:
if cmd == "L": # 방향만 전환
d = dirL[d]
continue
elif cmd == "R":
d = dirR[d]
continue
elif cmd == "F": # 현재 방향으로 한 칸 이동
r += dr[d]
c += dc[d]
elif cmd == "B":
r -= dr[d]
c -= dc[d]
# 최소 행/열, 최대 행/열 값 갱신
min_r = min(min_r, r)
min_c = min(min_c, c)
max_r = max(max_r, r)
max_c = max(max_c, c)
print(abs(max_r - min_r) * abs(max_c - min_c))
- 시간 : 308ms / 메모리 : 125056KB
- 고찰 : L, R, F, B 각각 주어진 조건을 정확하게 구현해 한번에 pass 받았다. 방향 전환 리스트를 만들어 미리 어떻게 짤 지 구상하니 코드로 옮기는 데는 오래 걸리지 않았다. 문제를 읽고 코드의 구조를 어떻게 할지 빠르게 구상하는 습관을 가지자. Keep going!
'Problem Solving > boj' 카테고리의 다른 글
[BOJ] 1063. 늑대와 양(Python) (0) | 2021.03.11 |
---|---|
[BOJ] 3987. 보이저 1호(Python) / Simulation (0) | 2021.03.11 |
[BOJ] 1063. 킹(Python) / Simulation (0) | 2021.03.09 |
[BOJ] 9466. 텀 프로젝트(Python) / DFS (0) | 2021.03.09 |
[BOJ] 2023. 신기한 소수(Python) / DFS (0) | 2021.03.08 |