본문 바로가기
알고리즘 문제풀이

[백준 8911] 거북이 (Swift)

by SiO2whocode 2025. 3. 27.

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

 

시뮬레이션

격자판에서 0,0 점에서 거북이를 앞,뒤로 이동하거나 오른쪽,왼쪽으로 회전하는 명령들이 주어지면

그 명령대로 거북이가 이동했을 때 지나는 모든 점을 포함하는 최소 사각형의 넓이를 구하는 문제

 

접근방법

휴 격자판 나오면 늘 긴장하게 됨. 칸을 이동하는건 자신있는데 선을 따라 이동하는건 좀 어려운 것 같다.

근데 마음을 다잡고 문제를 풀어보니깐 이번 문제는 꽤 잘 풀렸다!

우선 어떻게 지나는 모든 점들을 포함하는 최소 직사각형의 넓이를 구하는 걸 먼저 생각했는데

생각해보니 넘 간단했다. 그냥 모든 점들의 최소x, 최대x, 최소y, 최대y를 구해서 가로 길이(최대x-최소x)와 세로길이(최대y-최소y)를 구해서 곱해주면 되는 거였음

 

그리고 방향전환

방향을 담아둔 배열을 만든다. dx = [0,1,0,-1] dy = [1,0,-1,0] (북 -> 동 -> 남 -> 서 순서)

오른쪽으로 90도씩 회전하면 이 순서대로 돌면 된다.

반대로 왼쪽으로 90도씩 회전하는거면 반대로 돌면된다.

 

따라서 R일 때는 인덱스를 1씩 증가시키고 4로 나눈 나머지가 다음 방향의 인덱스가 되고

L일 때는 인덱스를 1씩 감소시키고 4를 더한 후 4로 나눈 나머지가 다음 방향의 인덱스가 된다. 4를 더하는건 음수 범위가 안되도록 하기 위해서 4로 나눈 나머지를 구하는 것도 (0~3)범위를 벗어나지 않게 하려고

 

소스코드

import Foundation

func solution() -> [Int] {
    // general
    let dx = [0,1,0,-1]
    let dy = [1,0,-1,0]
    
    // input
    let T:Int = Int(readLine()!)!
    var results:[Int] = []
    
    for _ in 0..<T {
        // case start
        let inst:[Character] = Array(String(readLine()!))
        
        var minx = 0
        var miny = 0
        var maxx = 0
        var maxy = 0
        
        var cx = 0
        var cy = 0
        var cd = 0 // 현재 방향
        
        for c in inst {
            switch c {
            case "F":
                cx = cx+dx[cd]
                cy = cy+dy[cd]
            case "B":
                cx = cx-dx[cd]
                cy = cy-dy[cd]
            case "R":
                cd = (cd+1)%4
            case "L":
                cd = (cd-1+4)%4
            default:
                continue
            }
            
            minx = min(minx, cx)
            miny = min(miny, cy)
            maxx = max(maxx, cx)
            maxy = max(maxy, cy)
        }
        
        let area = (maxx-minx)*(maxy-miny)
        results.append(area)
        // case end
    }
    
    return results
}

solution().forEach { print($0) }

 

좀 겁먹었는데 생각한대로 쉽게 풀려서 기분 좋다! HBD!!

728x90