반응형
안녕하세요. 개발 중인 정주입니다.
오늘은 프로그래머스(Lv.2) - 최솟값 만들기 문제를 풀었습니다.
목차
Github
문제 링크
풀이
프로그래머스의 컴파일러 변덕으로 괜히 두 세 번 푼 문제입니다.
처음에는 0 ~ A 길이만큼 reduce로 해결했는데 효율성 테스트 1번에서 시간 초과가 발생했습니다.
그래서 "아! 이건 절반만 반복해도 되는구나!"라고 생각해서 half만큼 reduce로 해결해서 통과했습니다.
그런데 다른 분의 풀이는 0 ~ A 길이만큼 반복하는 아주 심플한 방법이더라고요?
reduce와 for 시간 비교
그래서 reduce와 for의 시간을 비교해보았습니다.
0 ~ A 길이
0에서 A의 길이까지 반복을 한 실행 결과입니다. 1번이 for문이고 2번이 reduce 풀이입니다.
아래 코드의 주석 번호로는 1번 사진이 3번 코드, 2번 사진이 4번 코드입니다.
놀랍게도 일반 반복문이 대부분의 테스트에서 미세하게 빠릅니다.
0 ~ A/2 길이
절반만 반복한 결과입니다.
1번 사진이 for문, 2번 사진이 reduce입니다.
놀랍게도 별 차이가 없네요.
사실 많이 허탈한 감이 있습니다만, 최소한 프로그래머스에서 reduce는 일반 for보다 느리다는 사실을 알 수 있었습니다.
프로그래머스의 컴파일러 변덕이 심하다는 사실도요...^^
전체 코드
import Foundation
func solution(_ A:[Int], _ B:[Int]) -> Int
{
var ans = 0
let A = A.sorted()
let B = B.sorted(by: >)
let count = A.count
let half = Int(ceil(Double(A.count)/2.0))
//1
for i in 0..<half {
ans += (A[i] * B[i])
if i < count-i-1 {
ans += (A[count-i-1] * B[count-i-1])
}
}
//2
// ans = (0..<half).reduce(0) {
// var sum = A[$1] * B[$1]
// if $1 < count-$1-1 {
// sum += A[count-$1-1] * B[count-$1-1]
// }
//
// return $0 + sum
// }
//3
// for i in 0..<A.count {
// ans += (A[i] * B[i])
// }
//4
// ans = (0..<A.count).reduce(0) {
// $0 + A[$1] * B[$1]
// }
return ans
}
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.
반응형