문제 : 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축의 차를 곱해서 직사각형의 넓이를 구했다.