경험의 기록

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

 

8911번: 거북이

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

www.acmicpc.net

 

// 8911. 거북이

import java.util.*
import kotlin.math.*

fun main() = with(Scanner(System.`in`)){
    var t = nextInt()
    nextLine()

    for(i in 0 until t){
        println(move(nextLine()))
    }
}

fun move(str : String) : Int{
    var currentX = 0
    var currentY = 0
    var maxX = 0
    var maxY = 0
    var minX = 0
    var minY = 0

    var status = 0 // 0북 1동 2남 3서

    for(i in str){
        when(i){
            'F'->{
                when(status){
                    0-> {
                        currentY += 1
                    }
                    1 -> {
                        currentX += 1
                    }
                    2-> {
                        currentY -= 1
                    }
                    3 -> {
                        currentX -= 1
                    }
                }
            }
            'B'->{
                when(status){
                    0-> {
                        currentY -= 1
                    }
                    1 -> {
                        currentX -= 1
                    }
                    2-> {
                        currentY += 1
                    }
                    3 -> {
                        currentX += 1
                    }
                }
            }
            'L'->{
                // 왼쪽 90도 회전
                status--
                if(status==-1){
                    status = 3
                }
            }
            'R'->{
                // 오르쪽 90도 회전
                status++
                if(status==4){
                    status = 0
                }
            }
            else ->{
                return 0
            }
        }
        maxX = max(maxX,currentX)
        minX = min(minX,currentX)

        maxY = max(maxY,currentY)
        minY = min(minY,currentY)
    }

    currentX = abs(minX) + maxX
    currentY = abs(minY) + maxY

    return currentX * currentY
}

일반적인 시뮬레이션 문제이다.

거북이의 방향을 기억하여 이동시켜주고,

이동할 때 마다 그 위치가 최소,최댓값인지 기록하여

모든이동이 종료 되었을 때 x축의 차, y축의 차를 곱해서 직사각형의 넓이를 구했다.

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading