본문 바로가기
Computer Science/Algorithm

[백준] 2869 - 달팽이는 올라가고 싶다 (Java)

by soro.k 2022. 9. 18.


 

 

 

[백준] 2869번 : 달팽이는 올라가고 싶다 - JAVA [자바]

https://www.acmicpc.net/problem/2869 2869번: 달팽이는 올라가고 싶다 문제 땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다. 달팽이는 낮에 A미터 올라갈 수 있다. 하지만,

st-lab.tistory.com

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] str = br.readLine().split(" ");

        int A = Integer.parseInt(str[0]);
        int B = Integer.parseInt(str[1]);
        int V = Integer.parseInt(str[2]);

        int day = (V - B) / (A - B);
        if ((V - B) % (A - B) != 0) {
            day++;
        }
        System.out.println(day);
    }
}

 

처음에는 반복문으로 풀었었는데 이 문제에서는 반복문을 쓰지 않고 시간 제한을 초과하지 않도록 하는 게 포인트였다.

근데 계속 저 전체 길이에서 왜 B 길이를 빼주는지 이해가 안 갔다. 이 문제 포스팅만 10개도 넘게 보면서 다른 사람들이 어떻게 해석을 썼는지 들여다보고 노트에 써보고 난리를 쳤다. 난 왜 이런 간단한 수학 문제가 더 어려운 건지...

 

어쨌든 내가 이해한 바로는 이렇다. 정상에 도달하면 미끄러지지 않는다는 조건이 제일 중요하다. 계~속 (A - B) 값을 올라가다가 마지막 날에는 A 값만 더해진다. 전제는 언젠가는 정상에 도착한다는 것이고 그 정상에 도달하면 미끄러지지 않으니까 마지막 날에는 B값을 빼지 않게 된다. 그러니까 전체 길이에서 애초에 B값을 뺀 후에 (A - B)값을 나눠서 일수를 계산하는 것이다. 아 드디어 이해했다.

 

 

참고. 수식을 만드는 게 중요! 계속 반복문으로 풀다 보면 이런 시간 제한 문제를 통과 못할 수도 있다.