문제 소개
다각형의 면적을 구하는 문제이다.
문제 풀이
CCW 알고리즘
이 문제는 CCW(Count Clockwise) 알고리즘을 사용했다. 단순히 정답만 궁금하다면 아래 정답코드를 참고하면 된다. 기하학이 나와서 문제가 골드인데 사실 공식만 안다면 단순한 구현문제이다. 솔직히 벡터의 외적을 사용하지 않고 이 문제를 쉽게 푸는 방법을 모르겠다...
두 백터의 외적을 통해 벡터가 시계방향인지, 반시계방향인지 판별할 수 있는데, 아래의 코드로 CCW 를 구현할 수 있다.
func ccw(_ A: Point, _ B: Point, _ C: Point) -> Int {
return (B.x - A.x) * (C.y - A.y) - (B.y - A.y) * (C.x - A.x)
}
이 벡터의 외적을 2로 나눈 후 절댓값이 넓이가 된다. 이를 활용하여 코드를 작성하면 된다.
정답 코드
import Foundation
let n = Int(readLine()!)!
struct Point {
var x: Int
var y: Int
}
func ccw(_ A: Point, _ B: Point, _ C: Point) -> Int {
return (B.x - A.x) * (C.y - A.y) - (B.y - A.y) * (C.x - A.x)
}
var points: [Point] = []
for _ in 0..<n {
let xy = readLine()!.split(separator: " ").map { Int($0)! }
let point = Point(x: xy[0], y: xy[1])
points.append(point)
}
var answer = 0.0
for i in 1..<n-1 {
answer += Double(ccw(points[0], points[i], points[i+1]))/2
}
print(String(format: "%.1f" , abs(answer)))
'→ Problems' 카테고리의 다른 글
[Algorithm] 백준 - 27172번 수 나누기 게임 (Swift) (1) | 2024.06.18 |
---|---|
[Algorithm] 백준 - 2467번 용액 (Swift) (0) | 2024.06.17 |
[Algorithm] 백준 - 3055번 탈출 (Swift) (0) | 2024.06.15 |
[Algorithm] 백준 - 16954번 움직이는 미로 탈출 (Swift) (1) | 2024.06.14 |
[Algorithm] 백준 - 16933번 벽 부수고 이동하기 3 (Swift) (1) | 2024.06.13 |