플랫폼 | 번호 | 제목 | 유형 | 난이도 | 언어 |
---|---|---|---|---|---|
백준 | 1072 | 게임 | 이분탐색 | 실버3 | Swift |
경우의 수가 많아 보여 이분탐색으로 접근했다. 이분탐색은 log(N)
의 시간 복잡도이며 많은 경우의 수를 확인해야 하는 때에 적합하다.
이분탐색을 하려면 탐색 데이터가 필요한데 그게 무엇일까??
문제에서 '앞으로의 모든 게임에서 지지 않는다'라고 했으니 적어도 처음에 입력 된 게임 횟수 X
만큼 더 이기면 승률은 무조건 올라가지 않을까 생각했다.
그래서 결국 1 ~ X(게임 횟수)
의 모둔 수로 이분탐색 하면서 승률을 계산하고 비교 하는 것이다.
let input = readLine()!.split(separator: " ").map{ Int($0)! }
let (x, y) = (input[0], input[1])
let z = y * 100 / x
var start = 0
var end = x
var result = -1
while start <= end {
let mid = (start + end)/2
let nx = x + mid
let ny = y + mid
let nz = ny * 100 / nx
if z < nz {
result = mid
end = mid - 1
} else {
start = mid + 1
}
}
print(result)
처음에는 승률을 아래와 같이 계산했다. 그랬더니 당연히 Int형의 연산이기 때문에 y / x
의 값은 0이 나왔다.
(y / x) * 100
다시 아래와 같이 수정해서 굳이 Double형으로 변환 하지 않고 승률을 계산할 수 있었다.
y * 100 / x
처음에는 1 ~ 1,000,000,000
로 문제를 통과 했지만 생각해 보니 '굳이 저 범위 까지 해야 되나' 라는 생각이 들었다.
1 ~ X(게임 횟수)
로도 충분할 것 같았고 무사히 통과했다.