2869번: 달팽이는 올라가고 싶다
첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)
www.acmicpc.net
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int day = sc.nextInt();
int night = sc.nextInt();
int h = sc.nextInt();
//무엇을 찾을 것인가? 며칠 걸리는지(걸리는 일수)
int left = 0; //최소 범위? 1일
int right = h; //최대 범위? h+1일
int mid = 0;
int ans = 0;
while(left<=right){
mid = (left+right)/2;
//1일차 낮에 h에 도달하는 경우부터 시작해서 mid값 예측
if((mid-1)*(day-night)+day < h){
left = mid+1;
}
else {
right = mid-1;
//(mid-1)*(day-night)+day == h 인 경우가 없을 때를 대비해서 mid값 저장
ans = mid;
}
}
System.out.println(ans);
}
}
이분탐색으로 생각하는거 어렵다ㅠㅠ 알듯 모를듯 하다가 모르겠다ㅠㅠ
[문제 풀이 생각 과정]
아주 단순하게 while문 안에 if문으로 풀었더니 - 시간초과가 났다. '이분탐색으로 꼭 풀어봐야하는 문제'라길래 냉큼 풀어보기!
1. 무엇을 찾을 것인가? '며칠' 걸리는 지
찾을 값 = mid 로 놓고 이분탐색으로 풀기! ( 예: mid<h이면 left=mid+1; 방식으로 mid값을 에측하면서 이분탐색 하기 )
2. '며칠'의 범위?
(mid - 1) * ( day - night ) + day 값을 기준으로 판단한다.
최소 = left = 0 : 1일차에 낮에 h에 도달한 경우로, mid=1일때가 최소 (1일 걸릴때)
최대 = right = h : 문제의 조건에서 B<A 이므로 하루에 최소 1씩 올라간다
- 그렇기 때문에 하루씩 h일 걸릴때, h+1일차에 낮에 h에 도달한 경우가 최대 걸리는 일수
3. (mid - 1) * ( day - night ) + day == h 인 경우가 없을 수 있다.
이때를 대비해서 mid값을 저장한 상태로 반복문 돌리기!
'1d-1c > BOJ' 카테고리의 다른 글
2775_부녀회장이 될테야 (JAVA) (0) | 2020.10.18 |
---|---|
10250_ACM 호텔 (JAVA) (0) | 2020.10.18 |
1193_분수 찾기 (JAVA) (0) | 2020.10.18 |
2839_설탕 배달 (JAVA) (0) | 2020.10.04 |
1712_손익분기점 (JAVA) (0) | 2020.10.04 |