2869. 달팽이는 올라가고 싶다. [JAVA]

Nak.s·2023년 1월 17일
0

CodeTest

목록 보기
10/19

낮에는 A만큼 올라가고, 밤에는 B만큼 내려가진다.
그리고 마지막날에는 정상에 도달하게 되니
A만큼 추가로 올라가고, 정상에 도달하게된다.

공식을 한번 직접 도출해보았다.
up은 올라가는 높이, down은 내려가는 높이, totalHeight는 총 높이 이다.
n은 정상에 도달하고자 하는 필요한 일 수 이다.

up + (up - down)n > totalHeight -> 마지막날 올라가는 높이 + 하루에 올라가는 높이 x 일수(n) > 총 높이
(up - down)n > totalHeight - up
(up - down)n > totalHeight - up
n > (totalHeight - up) / (up - down)

up : 3, down : 1, height : 7 로 예를 들면
3 + (3-1)n > 7
(3-1)n > 7 - 3
2n > 4
n > 2
즉 올라가야 하는 일수는 2일 보다 무조건 커야되니,
그 다음날 올라가는일 수 + 1 해주면 된다.

그리고, 문제 선행 조건에 up은 down 보다 작거나 같을 수 없다라는 조건이 있기에,
(totalHeight - up)/(up - down) 나눗셈에서 소숫 자리는 어차피 이동한 날을 의미하게 되서
올림처리하면 된다.

public class BJ_2869 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " "); //속도 이슈로 BufferedReader 사용

        int up = Integer.parseInt(st.nextToken());
        int down = Integer.parseInt(st.nextToken());
        int totalHeight = Integer.parseInt(st.nextToken());

        if (0 > down) return;
        if (down >= up) return;
        if (up > totalHeight) return;
        
        double denominator = totalHeight - up;
        double numerator = up - down;
        double finalMovingDay = Math.ceil(denominator / numerator) + 1;
        
        System.out.println((int) finalMovingDay);

    }
}
profile
궁금함이 많은 개발자

0개의 댓글