본문 바로가기
프로그래밍/백준 알고리즘 코드

백준 2869번 java 달팽이는 올라가고 싶다 (수학1)

by 졸린이 2020. 12. 1.
반응형

여기 쓰잘대기 없이 나무막대를 올라가는 달팽이가 있다.

첫 줄에 세 정수를 입력한다. A B V 낮에 A만큼 올라가고 밤에 B만큼 내려가는데 V까지 올라가야 하고 올라가면 멈춘다.

며칠이 걸릴지 구하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.util.StringTokenizer;
import java.io.*;
 
//baekjoon_2869_달팽이는 올라가고 싶다
public class Main{
    public static void main(String[] args) throws IOException{
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        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 ans = 1 + ((v-a) % (a-b) == 0 ? (v-a) / (a-b) : (v-a) / (a-b) + 1);
        bw.write(ans+"\n");
        bw.flush();
        br.close();
        bw.close();
    }
}
cs

문제 자체는 간단한데 거참.. 시간제한이 매우 짧게 걸려있어서 귀찮은 문제다.

Scanner로 풀면은 어지간해서는 시간초과가 떠버리고 만다.

그래서 BufferdWriter과 BufferedReader로 입출력을 하면 통과가 된다.

그리고 알고리즘자체는 15라인에 있는데 간단하게 살펴보자면~

v는 올라가야할 길이 a는 하루에 올라가는 높이 b는 하루에 떨어지는 높이 즉 a-b가 하루에 올라가는 높이가 된다.

 

그런데 보기에는 v까지니까 v / a-b로 계산해야 할 것 같은데 보면은 v-a / a-b로 되어 있다.

그것은 v까지 올라가기만 하면 미끄러지지 않기 때문에 하루는 a-b가 아니라 도달하고 끝이게 된 것이다.

 

그리고 삼항연산에서 체크하는 것은 나눠 떨어지느냐 아니냐 인데 나눠 떨어지면 딱 낮에 a만큼 올라가서 정상인 것이고 나눠 떨어지지 않으면 a 보다 적은 값으로 도착하지 못하여 다시 떨어지고 올라가서 하루 뒤에 도착하는 것을 뜻한다.

그래서 뒤에 + 1을 해주고 다시 전체에 + 1 을 해주는 것은 처음 출발할 때 0에서 출발하기 때문이다.

 

 

 

 

반응형

댓글