일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- level13
- ftz level13
- System
- C
- 백준
- OSI
- 암호수학
- c언어
- ftz
- Java
- PHP
- HTML
- 미로 탐색 알고리즘
- 자료구조
- SWiFT
- 스택
- War Game
- windosws wbcs
- 두근두근 자료구조
- LoB
- 큐
- 시간복잡도
- Stack
- pwnable.kr
- windosw 문자열
- 정렬 알고리즘
- 재귀
- 파이썬
- web
- 파일 시스템
Archives
- Today
- Total
나의 기록, 현진록
[Swift] 백준 게임 1072 본문
반응형
1. 문제 이해
- (이긴게임 / 게임횟수) * 100 = 승률
- 승률이 변하는 최소 게임 횟수를 구하라.
- 앞으로 모든 게임에서 승리
- 승률이 변한다 == 승률이 높아진다
- 승률이
변하는높아지는 최소 게임 횟수를 구하라.
2. 설계
- X : 게임횟수
- Y : 이긴 게임
- ( (이긴게임+N) / (게임횟수+N) ) * 100 = 승률 → ( (Y+N) / (X+N) ) * 100 = 승률
- 조건
- 1부터 10억까지 순서대로 연산은 시간 초과
- 이분탐색으로 최소 게임 횟수 구하기
3. 코드
- ( (Y+N) / (X+N) ) * 100 밑줄 친 부분이 실수가 됨
- 실수에서의 곱하기 연산 시 부동소수점 오류 발생
- 수정 → ( (Y+N) * 100 ) / (X+N)
- 예시) 0.99 * 100보단 9900/100가 안전
- 0.9899999999…, 0.333333333334와 같은 부동소수점 연산 특성상 오차 누적 가능성
import Foundation
func solution(){
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let X = input[0]
let Y = input[1]
let cur = (Y*100) / X // 현재 승률
var left = 1
var right = 1000000000
var result = Int.max
// 소수점을 무조건 버리기 때문에 이미 승률이 99퍼 이상일 때 변할 수 없음
if cur >= 99{
print("-1")
return
}
// 이분탐색
while left<=right{
let mid = (left + right) / 2
let n = ((Y+mid)*100) / (X+mid)
if cur != n{
right = mid - 1
result = mid // 최소 게임횟수 찾기
}else{
left = mid + 1
}
}
print(result)
}
solution()
반응형
'Programming > Algorithm & Data Structure' 카테고리의 다른 글
[Swift] 프로그래머스 입국심사 (2) | 2024.11.13 |
---|---|
[Swift] 프로그래머스 코딩테스트 연습 > 연습문제 > 인사고과 (0) | 2023.05.03 |
[Swift] 프로그래머스 코딩테스트 연습>2022 KAKAO TECH INTERNSHIP > 두 큐 합 같게 만들기 (0) | 2023.03.20 |
[Swift] 프로그래머스 코딩테스트 연습> 연습문제> 기사단원의 무기 (0) | 2023.01.05 |
[Swift] 프로그래머스 코딩테스트 연습> 연습문제 > 점 찍기 (0) | 2023.01.05 |