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
'알고리즘 문제풀이' 카테고리의 다른 글
[백준 12851] 숨바꼭질 2 (Swift) (0) | 2025.03.31 |
---|---|
[백준 2176] 합리적인 이동경로 (C++) (0) | 2025.03.26 |
[백준 12026] BOJ 거리 (Swift) (0) | 2025.03.25 |
[백준 16953] A -> B (Swift) (0) | 2025.03.24 |
[프로그래머스] 보석 쇼핑 (Swift) (0) | 2025.03.21 |