🔗 백준 2869 - 달팽이는 올라가고 싶다
문제

알고리즘 분류
풀이
처음 시도했던 코드
- 처음에는 반복문을 이용해 V미터가 될 때까지 A를 더하고 B를 빼기를 반복하여 반복횟수를 저장했음
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 count = 0;
int position = 0;
for(int i = 1; ; i++){
position += A;
position -= B;
count++;
if(position+B >=V){
break;
}
}
System.out.println(count);
- 그러나 이 경우 시간초과가 떴고,
- 질문 게시판에서 이 문제는 O(1)만에 풀어야한다는 답글을 발견하고 아래 코드와 같이 수정
1. 입력
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());
2. 도개걸윷모 switch-case문 추가
- 정상에 올라간 후에는 미끄러지지 않으므로, 달팽이가 올라가야 하는 높이는 V-B미터
- 또 낮과 밤을 거쳐 달팽이가 하루에 올라갈 수 있는 거리는 A-B미터 (단, A>B)
- 한 번에 구하기 위해 (V-B)/(A-B)을 해주되, 딱 나누어떨어지지 않는 경우는 이 결과값에 +1을 해주어야한다.
- 따라서 Math라이브러리의 ceil(올림)함수를 이용
int res = (int)Math.ceil((double)(V-B) / (A-B));
System.out.println(res);
전체 코드
import java.io.*;
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 res = (int)Math.ceil((double)(V-B) / (A-B));
System.out.println(res);
}
}