시간초과 코드
이분 탐색을 사용하지 않으면 다음과 같이 코드를 만들 수 있습니다.
하지만 원하는 값이 나올때까지 모든 모든 경우의 수를 탐색해야 한다는 문제점이 있습니다.
이렇게 코드를 작성하면 시간 복잡도가 O(log n*m) 만큼 나올 수 있으며 이는 시간초과를 일으킵니다.
var line = readLine()!.split(separator: " ").map({Int($0)!})
var arr: [Int] = []
for _ in 1...line[0] {
arr.append(Int(readLine()!)!)
}
for i in stride(from: arr.max()!, to: 0, by: -1) {
var count = 0
for j in arr {
count += (j / i)
}
if count == line[1] {
print(i)
break
}
}
이분 탐색로 시간초과 해결
- 이분 탐색이란 찾고 싶은 데이터를 절반으로 나눕니다.
- 나눠진 절반에서 값을 탐색합니다.
- 만약 count가 필요한 requiredCount보다 크다면 탐색한 범위가 찾고자하는 값이 포함되지 않다는 것을 의미합니다.
- 원하는 값이 나올때까지 계속 절반으로 나눈값을 또 절반으로 나눠 탐색합니다.
아래와 같이 시간 복잡도가 O(n log m)의 시간 복잡도를 가지기 때문에 시간초과 문제를 해결할 수 있게 됩니다
var line = readLine()!.split(separator: " ").map({Int($0)!})
var arr: [Int] = []
for _ in 1...line[0] {
arr.append(Int(readLine()!)!)
}
let requiredCount = line[1]
var left = 1
var right = arr.max()!
var result = 0
while left <= right {
let mid = (left + right) / 2
var count = 0
for length in arr {
count += (length / mid)
}
if count >= requiredCount {
result = mid
left = mid + 1
} else {
right = mid - 1
}
}
print(result)
'Algorithm > Baekjoon' 카테고리의 다른 글
Swift - 백준 2292 벌집 (0) | 2024.08.05 |
---|---|
Swift - 백준 1929 소수 구하기 (0) | 2024.08.04 |
Swift 백준 1546 평균 (0) | 2024.07.23 |
Swift 백준 1181 단어 정렬 (0) | 2024.07.22 |
Swift 백준 1259 팰린드롬수 (reversed) (0) | 2024.07.21 |