https://school.programmers.co.kr/learn/courses/30/lessons/152996
탑승한 사람의 무게와 시소 축과 좌석 간의 거리의 곱이 양쪽 다 같다면 시소 짝꿍이라고 할 수 있다. 각 사람의 무게와 시소 중심으로부터 2m, 3m, 4m 경우를 따져가면서 문제를 접근하였지만 시간 초과
가 발생하였다.
import Foundation
func solution(_ weights:[Int]) -> Int64 {
var result: Int64 = 0
for i in 0..<weights.count {
for j in i+1..<weights.count {
let first = weights[i]
let second = weights[j]
if first == second {
result += 1
continue
}
if first*2 == second*3 {
result += 1
continue
}
if first*2 == second*4 {
result += 1
continue
}
if first*3 == second*4 {
result += 1
continue
}
if first*3 == second*2 {
result += 1
continue
}
if first*4 == second*2 {
result += 1
continue
}
if first*4 == second*3 {
result += 1
continue
}
}
}
return result
}
weights의 길이가 최대 100,000이므로 2중 for문을 사용하면 당연히 시간초과가 발생한다. 따라서, 1번의 for문을 사용해서 사람의 몸무게를 key, 해당 몸무게가 등장한 사람 수를 value로 판단함으로써 맵핑하였고 아래와 같은 논리를 적용하여 해결하였다.
느낀 점은 구현하는 데에 시간을 단축하기 위해 범위를 먼저 확인하고 곱셈, 나눗셈 연산할 때 조건을 잘 따지자..
import Foundation
func solution(_ weights:[Int]) -> Int64 {
func calculate(_ num: Int) -> Int { // 같은 몸무게인 사람이 여러명일경우
var sum = 0
for i in 1..<num {
sum += i
}
return sum
}
var result: Int = 0
var arr: [Int] = Array(repeating: 0, count: 1000*4+1)
var multiplier = [2,4,3]
var divider = [1,3,2]
for weight in weights {
arr[weight] += 1
}
for i in 0..<arr.count {
// 몸무게 범위를 벗어날 경우
if i < 100 || i > 1000 {
continue
}
// 존재하지 않는 몸무게일 경우
if arr[i] == 0 {
continue
}
// 같은 몸무게인 사람이 여러명일 경우
if arr[i] > 1 {
result += calculate(arr[i])
}
// 각 조건을 따진다.
for j in 0..<3 {
if (i % divider[j] != 0) { // 이 조건을 지켜줘야 한다.
continue
}
result += arr[i] * arr[(i / divider[j]) * multiplier[j]]
}
}
return Int64(result)
}