https://www.acmicpc.net/problem/2869
2869번: 달팽이는 올라가고 싶다
첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)
www.acmicpc.net
시간 제한이 0.15초로 짧다. 그리고 정답 비율도 매우 낮다.
그리고 역시나 그냥 생각나는대로 이렇게 반복문으로 풀었더니 시간초과가 났다.
int total = 0;
int day = 0;
while(total<v)
{
day++;
total += a;
if(total == v) break;
total-=b;
}
System.out.println(day);
수학적인 수식으로 풀어야한다.
달팽이는 매일 (A - B)씩 V미터까지 올라간다.
일단 달팽이는 목표 지점에 도착하면 미끌어지지 않는다.
이것을 감안하면 총 (V - B) 미터를 올라가게 하면 된다.
즉, (V - B) / (A - B) 가 달팽이가 이동한 날의 수다.
이 때 (V - B) / (A - B) 가 0으로 딱 나눠떨어지지 않는다면 하루가 더 소요되기 때문에 +1을 해준다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
int day;
if((v-b)%(a-b)==0) day = (v-b)/(a-b);
else day = (v-b)/(a-b)+1;
System.out.println(day);
}
}
근데 여기서 (V-B)에 1을 미리 빼놓고 몫에 무조건 +1을 해주면
int형끼리의 연산이기 때문에 나머지가 있는지 없는지 구분할 필요가 없다.
int day = (v-b-1)/(a-b)+1;
'ALGORITHM' 카테고리의 다른 글
[JAVA] 백준 10250번- ACM 호텔 (0) | 2022.08.24 |
---|---|
[JAVA] 백준 2839번- 설탕 배달 (0) | 2022.08.24 |
[JAVA] 백준 2775번- 부녀회장이 될테야 (0) | 2022.08.24 |
[JAVA] 백준 10757번- 큰 수 A+B (0) | 2022.08.22 |
[JAVA] 알고리즘 : DFS- 부분집합 구하기 (0) | 2022.08.22 |