코딩테스트

[Swift 알고리즘] 백준 BOJ 1297 - TV 크기

유정주 2021. 9. 7. 00:10
반응형

BOJ 1297 - TV 크기

안녕하세요. 개발 중인 정주입니다.

 

오늘은 BOJ의 1297번 TV 크기 문제를 풀었습니다.

수학적인 지식이 필요하고 그 지식을 Swift로 작성할 수 있느냐가 포인트였습니다.


Github

https://github.com/jeongju9216/swiftAlgorithm

 

문제 링크

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

 


풀이

피타고라스 정리제곱근을 이용한 문제입니다.

 

1. 대각선^2 = 가로^2 + 세로^2

2. 대각선^2 = (가로 비율 * x)^2 + (세로 비율 * x)^2

3. x = (대각선^2 / (가로비율^2 + 세로 비율^2))의 제곱근

4. result = x * 가로비율, x * 세로 비율

 

pow(), sqrt()를 이용해서 풀었는데 새로운 사실을 하나 알았습니다.

코드 먼저 보시죠.


1차 코드

import Foundation

let input = readLine()!.split(separator: " ").map { Double(String($0))! }
let x = sqrt(pow(input[0], 2) / (pow(input[1], 2) + pow(input[2], 2)))
print(Int(floor(x * input[1])), Int(floor(x * input[2])))

마지막에 조심해야 할 것은 반올림이 아닌 버림을 택해야 한다는 것입니다.

따라서 floor()를 사용한 후 Int로 형 변환하였습니다.

 

처음에는 제곱근이니 sqrt()를 사용하면 되겠지? 생각하였습니다.

결과는 맞았지만 16ms로 빠르다고 생각할 수 없는 속도입니다.

그래서 다른 사람의 코드를 참고하여 최종 코드를 작성하였습니다.


최종 코드

import Foundation

let input = readLine()!.split(separator: " ").map { Double(String($0))! }
let x = pow(pow(input[0], 2) / (pow(input[1], 2) + pow(input[2], 2)), 0.5)
print(Int(floor(x * input[1])), Int(floor(x * input[2])))

보이시나요? 4ms가 빨라진 결과를 볼 수 있었습니다.

바로 sqrt()를 pow()로 바꾼 덕입니다.

이 문제를 통해 sqrt()보다 pow()로 0.5 제곱을 하는 것이 더 빠르다는 것을 배웠습니다.

 


마무리 인사

오늘은 처음으로 Swift를 이용해 수학 문제를 풀었습니다.

제곱근, 제곱, 버림을 구현하였는데요. Swift의 내장 함수가 훌륭하니 문제를 풀기 좋았습니다.

각 함수마다 실행 속도가 다르다는 것도 배울 수 있었습니다.

 

감사합니다!


아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

반응형