728x90
문제
V까지 올라가는데 걸리는 날(시간) 구하기
A : 1day 전진거리(m)
B : 1day 후진거리(m)
V : 총 올라갈 거리(m)
(1 ≤ B < A ≤ V ≤ 1,000,000,000)
링크 : https://www.acmicpc.net/problem/2869
풀이방법
: 마지막 날에 더해질 값을 미리 빼놓고 계산하고 하루를 더하는 원리이며,
나머지가 남는다는 것은 그만큼 하루 더 가야한다는 원리
* 일일이 반복으로 더하지 않고 단순 산술이라, 속도가 향상됨
나의 코드
1. 직역: 쌩으로 계산 때려박음 => 시간초과 (호오..역시 호락호락하면 문제가 아니지)
더보기
public class no2869 {
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 X = 0;
int count = 0;
while(X<V) {
count++;
X += A;
if (X>=V) {
break;
}
X -= B;
}
System.out.println(count);
}
}
2. 케이스를 나눠 계산(속도 향상) + 삼항연산자로 정리(속도와는 무관)
: 반복문이 없어 O(1)로 처리 가능.
: A-B를 X라고 가정했을 때,
1) X가 1이면, (V-A)/X의 나머지에 1을 더한 값이 날짜수
2) X가 1이 아니면서 (V-A)/X의 나머지가 0일 경우엔, 몫만큼에 하루를 더한 값이 날짜수
2) X가 1이 아니면서 (V-A)/X의 나머지가 0이 아닐 경우엔, 몫만큼에 이틀을 더한 값이 날짜수
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
Integer A = Integer.parseInt(st.nextToken());
Integer B = Integer.parseInt(st.nextToken());
Integer V = Integer.parseInt(st.nextToken());
int caseA = ((V - A) / (A - B)) + 1;
int caseB = ((V - A) / (A - B)) + 2;
int result = (A - B == 1) ? caseA : ((V - A)%(A - B)==0) ? caseA : caseB;
System.out.println(result);
}
}
728x90
'알고리즘 저장소 (일반방식과 나만의 풀이) > JAVA' 카테고리의 다른 글
[백준] no1944: 프린터 큐 (0) | 2023.01.05 |
---|---|
[백준] no11866: 요세푸스 수열 (0) | 2023.01.05 |
[Java] 코드 실행시간 측정 (0) | 2023.01.02 |
[백준] no1920: 수 찾기 (0) | 2023.01.02 |
[백준] no1259: 펠린드롬수 (0) | 2022.12.31 |