본문 바로가기

Problem Solving/boj

[BOJ] 8911. 거북이(Python) / Simulation

www.acmicpc.net/problem/8911

 

8911번: 거북이

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 컨트롤 프로그램이 주어진다. 프로그램은 항상 문제의 설명에 나와있는 네가지 명령으로만 이루어져

www.acmicpc.net

실버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!