https://www.acmicpc.net/problem/8911
import sys
input = sys.stdin.readline
# 상근이는 2차원 평면 위에서 움직일 수 있는 거북이 로봇을 하나 가지고 있다.
# L과 R명령을 내렸을 때, 로봇은 이동하지 않고, 방향만 바꾼다.
# 상근이는 자신의 컨트롤 프로그램으로 거북이가 이동한 영역을 계산
# 출력 : 거북이가 지나간 영역을 모두 포함할 수 있는 가장 작은 직사각형의 넓이
# 단, 거북이가 지나간 영역이 직사각형을 만들지 않는 경우도 있다.
# F : 한 눈금 앞으로
# B : 한 눈금 뒤로
# L : 왼쪽으로 90도 회전
# R : 오른쪽으로 90도 회전
# 거북이는 가장 처음에 (0, 0)에 있고, 북쪽을 쳐다보고 있다.
dx, dy = [-1,0,1,0], [0,1,0,-1]
T = int(input())
for _ in range(T):
cx, cy = 501, 501
direction = 0
maximum_x, maximum_y = 501, 501
minimum_x, minimum_y = 501, 501
program = list(input().rstrip())
for p in program:
if p == 'F':
cx, cy = cx + dx[direction], cy + dy[direction]
if cx < minimum_x:
minimum_x = cx
if cx > maximum_x:
maximum_x = cx
if cy < minimum_y:
minimum_y = cy
if cy > maximum_y:
maximum_y = cy
elif p == 'B':
if direction == 0:
temp_direction = 2
elif direction == 2:
temp_direction = 0
elif direction == 1:
temp_direction = 3
elif direction == 3:
temp_direction = 1
cx, cy = cx + dx[temp_direction], cy + dy[temp_direction]
if cx < minimum_x:
minimum_x = cx
if cx > maximum_x:
maximum_x = cx
if cy < minimum_y:
minimum_y = cy
if cy > maximum_y:
maximum_y = cy
elif p == 'L':
direction = (direction+3)%4
elif p == 'R':
direction = (direction+1)%4
print(abs(maximum_x - minimum_x)*abs(maximum_y-minimum_y))
이번 문제는 F, B, L, R 총 4가지 조작을 통해 거북이를 이동시키고, 이동시킨 영역을 포함하는 가장 작은 직사각형의 넓이를 구하는 문제이다.
방향을 나타내는 dx와 dy를 선언하여 주어진 조건에 맞게 구현하였다 :)
'Algorithm 💡 > Implementation' 카테고리의 다른 글
[삼성 SW 역량테스트 기출] 메이즈 러너 (1) | 2024.10.12 |
---|---|
[백준 16985번] Maaaaaaaaaze (0) | 2024.10.11 |
[삼성 SW 역량테스트 기출] 마법의 숲 탐색 (3) | 2024.10.09 |
[백준 21611번] 마법사 상어와 블리자드 (0) | 2024.10.05 |
[삼성 SW 역량테스트 기출] 고대 문명 유적 탐사 (2) | 2024.10.04 |