기능,개념 & 알고리즘/알고리즘

백준 2896 Java

ChoiDooSic 2021. 9. 29. 16:19

문제
땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.

달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.

달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.

입력
첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)

출력
첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.

 

※  달팽이 문제 풀이
2 1 5 를 입력받았을때에 달팽이가 정상에 도달하는 시간은 4일이다.
5 1 6 를 입력받았을때에 달팽이가 정상에 도달하는 시간은 2일이다.

100 99 1000000000 를 입력받았을때에 달팽이가 정상에 도달하는 시간은 999999901일이다.
이 문제의 규칙을 찾아보자
규칙1 : 달팽이는 하루를 A만큼 올라가고 자는사이 B만큼 미끄러지며 V만큼 올라가야한다
달팽이가 하루에 올라가는 양은 A - B이다.(정상에서는 미끄러지지않음)
       
1. days = (V - B) / (A - B) 의 이유를 알아보자.
(V - B) 최종 목표길이에 하루 떨어지는 양을 빼주는 이유는
달팽이는 하루 A만큼 오르고 B만큼 떨어지고 정상에 도달하면 떨어지지않는 규칙이있는데
정상에 올라간 후에는 떨어지지 않기때문에 총 길이에서 미끄러지는 길이만큼을 빼주어
정상에 가는 최소 일수를 구해주는 것이다.
   


3 2 6이라고 가정할때에 달팽이는 하루에 3 - 2 = 1 의 길이만큼 오르는데
1일차: 0 + 3 -> 3 - 2 = 1
2일차: 1 + 3 -> 4 - 2 = 2
3일차: 2 + 3 -> 5 - 2 = 3
4일차: 3 + 3 -> 6 정상도달
4일차에는 정상에 도달하여 2를 빼주지 않아도 되는 상황이 왔는데
총 길이에서 미끄러지는 길이만큼 빼준다면 하루 오르는 총 길이 즉, (A - B)를 이용하여
정상에 도달하기까지의 일수를 구할 수 있게 되는것이다.
   


2. if((V - B) % (A - B) != 0) days++; 의 이유를 알아보자
0이 아닐때에 하루를 더 더해주는 이유는
그림을 보자 달팽이는 1일차에 A - B의 길이를 올랐다
이때에 달팽이는 (V - B) % (A - B) 를 해줬을때에 0 이 아닌 값이 나온다면
5 1 6이라 가정했을때에 (5 - 1)의 길이를 올랐으나 6의 길이까지 가기에는 2가 부족하다

달팽이는 한번에 5를 오르고 정상에 오른후에는 떨어지지않기때문에

하루만 더 오른다면 정상에 도착하기때문에 나머지 값이 0이

아닐때에는 days++; 를 해주어 1일을 더해주는 것이다

 

이번 문제는 뭔가 글로 풀어내기 어려웠고 while문을 사용한다면

시간이 초과되어 문제를 풀수없게된다 그렇기에

수학적으로 접근해야했고 이번 문제도 고민을하다 정답을보고 이해하며

풀어내는 식으로 공부를 하였다.

머리로는 이해하겠는데 이걸 말로 풀어내자니 어려운것같다

(100% 이해하지 못했기 때문에 그런거같다고 생각한다)

앞으로 역량이 더 길러져 후일에는 말로 쉽게쉽게 누구나 보고 아!

할수 있도록 풀어낼 수 있으면 좋겠다.

 

 

'기능,개념 & 알고리즘 > 알고리즘' 카테고리의 다른 글

백준 2775 Java  (0) 2021.10.02
백준 10250 Java  (0) 2021.10.01
백준 1193 Java  (0) 2021.09.27
백준 3052 자바  (0) 2021.09.06
백준 2292 자바  (0) 2021.09.04