본문 바로가기
코딩테스트

[백준] 8911 거북이 - python

by CuckooBird 2023. 1. 29.

백준 8911 거북이

https://www.acmicpc.net/problem/8911

 

8911번: 거북이

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

www.acmicpc.net


코드

맞았습니다가 뜬 코드입니다. 

메모리 30752KB | 시간 1976ms | 코드 길이 1424B 

import sys
N = int(sys.stdin.readline().rstrip())
wide_li = []
for _ in range(N):
    turtle = list(map(str, sys.stdin.readline().rstrip()))
    dis = 0 # 북쪽 0 , 동쪽 1 , 남쪽 2 , 서쪽 3
    m = [0, 0, 0, 0] # 최소 x : m[0], 최대 x : m[1], 최소 y : m[2], 최대 y : m[3]
    now = [0, 0] # 현재 위치 (x, y)
    for t in turtle:
        if t == 'F':
            if dis == 0: # 북
                now[0] += 1
            elif dis == 2: # 남
                now[0] -= 1
            elif dis == 1: # 동
                now[1] += 1
            else:          # 서
                now[1] -= 1
            m[0] = min(m[0], now[0])
            m[1] = max(m[1], now[0])
            m[2] = min(m[2], now[1])
            m[3] = max(m[3], now[1])
        elif t == 'B':
            if dis == 0:  # 북
                now[0] -= 1
            elif dis == 2: # 남
                now[0] += 1
            elif dis == 1: # 동
                now[1] -= 1
            else:          # 서
                now[1] += 1 
            m[0] = min(m[0], now[0])
            m[1] = max(m[1], now[0])
            m[2] = min(m[2], now[1])
            m[3] = max(m[3], now[1])
        elif t == 'L': # 왼쪽일 때
            if dis == 0: # dis는 0~3 이므로 0일경우 3으로
                dis = 3
            else:        # dis --
                dis -= 1
        else: # 오른쪽일 때
            if dis == 3: # dis는 0~3 이므로 3일경우 0으로
                dis = 0
            else:        # dis ++
                dis += 1
    wide = (m[1] - m[0]) * (m[3] - m[2]) # 넓이 구하기
    wide_li.append(wide)
for i in wide_li:
    print(i)

방향을 dis에 저장하고, 최대최소 x, y는 배열 하나에 저장한 것 말고는 딱히 설명할 게 없네요.


후기

거! 룩한 인생 고귀한 삶을 살며

북! 그럼 없는 투명한 마음으로

이! 내 삶이 끝날 그 마지막 순간에 나 웃어보리라 나 바라는대로~