PS/문제 풀이
[프로그래머스/Swift] 152996번 - 시소 짝꿍
시르베어
2025. 3. 8. 15:22
🔗 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/152996
💡 구현 아이디어
- 중복된 무게의 개수 정리
- 2,3,4배를 한 무게를 정리
- 같은 무게에 대한 순서쌍 개수를 구함
- 최초의 무게가 같으면 2, 3, 4배에서 중복으로 순서쌍을 구해지므로 3, 4배의 순서쌍 개수를 제거
- 결과 반환
💻 코드
import Foundation
func solution(_ weights:[Int]) -> Int64 {
var weightMap: [Int : [Int]] = [:] // key: 무게, value: 해당 무게를 만들 수 있는 weight(idx)
var dupleMap: [Int : Int] = [:] // key weights에 담긴 무게, value: 중복 개수
// 중복 개수
weights.forEach { dupleMap[$0, default: 0] += 1 }
// 무게(2,3,4배)에 따른 개수
weights.enumerated().forEach {
weightMap[$0.element * 2, default: []].append($0.offset)
weightMap[$0.element * 3, default: []].append($0.offset)
weightMap[$0.element * 4, default: []].append($0.offset)
}
// 짝꿍의 수
let result = weightMap.reduce(0) { $0 + $1.value.count * ($1.value.count-1) / 2 }
// 중복 계산된 짝궁의 수
let t: Int = dupleMap.reduce(0) { $0 + $1.value * ($1.value - 1) }
return Int64(result-t)
}
❌ 틀린 이유 및 틀린 부분
- O(n^2)으로는 당연히 안된다 생각해서 이런저런 방법으로 바꿔서 했지만 결국 O(n^2)에 가까운 알고리즘만 짜져서 시간초과가 나왔다..
- 고민해서 전체 순서쌍 개수 - 중복 계산된 순서쌍 개수 라는 생각이 나왔고 다시 제출해서 정답
⏳ 시간 복잡도
O(n) - 전체 개수 * 3의 개수를 순회