최대공약수로 푸는 방법의 원리가 이해가 가지 않아 다른 방법을 찾아보던 중 일차함수를 이용한 방법을 알게되었다.
(0,0)에서 (w,h)를 지나는 직선은 y = (h/w)x로 표현 가능하다. 구한 함수를 토대로 x값을 넣어 y값을 활용하면 칸수를 구할 수 있다.
w는 8 h는 12일 때 y = (3/2)x 라는 함수가 나온다. 이 함수 x의 1을 대입하면 y는1.5가 나오니 1열에서 멀쩡한 칸은 12 - 2 = 10 칸이 된다. x의 2를 대입하면 y는 3이므로 2열에서 멀쩡한 칸은 12 - 3 = 9 칸이다. 이때 맨 밑에 1칸이 멀쩡한 칸이긴 한데 이건 굳이 신경 쓸 필요없다. 대각선을 기준으로 대칭이기 때문에 마지막까지 구한 값에 합에 * 2를 해주면 된다.
import Foundation
func solution(_ w:Int, _ h:Int) -> Int64{
var answer: Int64 = 0
// w,h를 Int로 계산하면 소수점까지 나오지 않기 때문에 형변환
let width = Double(w)
let height = Double(h)
// y = ax 함수
// 기울기 : h/w
// y = (h/w)x
for x in 1..<w{
// 1. x에 값 넣고 y값 구한다.
// 2. y값 반올림해준다.
let y = ceil(height/width*Double(x))
// 3. h에서 y값을 빼준다.
answer += Int64(height - y)
}
// 4. 대각선을 기준으로 한 쪽면만 구했으니 *2를 해준다.
return answer * 2
}