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의 내장 함수가 훌륭하니 문제를 풀기 좋았습니다.
각 함수마다 실행 속도가 다르다는 것도 배울 수 있었습니다.
감사합니다!
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.