[프로그래머스] 멀쩡한 사각형 Swift

승아·2021년 4월 21일
0

프로그래머스 - 멀쩡한 사각형

나의 풀이

최대공약수로 푸는 방법의 원리가 이해가 가지 않아 다른 방법을 찾아보던 중 일차함수를 이용한 방법을 알게되었다.

(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
}

0개의 댓글