IT/알고리즘
[BAEKJOON] 백준 2869번: 달팽이는 올라가고 싶다 (Python)
무녈
2021. 8. 23. 09:18
문제 링크: https://www.acmicpc.net/problem/2869
문제
땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.
달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.
달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)
출력
첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.
1차 풀이
코드
A, B, V = map(int,input().split())
day = 1
while V > A*(day) - B*(day-1):
day += 1
print(day)
문제 요약
- 높이가 V인 나무 막대를 A만큼 올랐다 B만큼 떨어지기를 반복하며 나무 막대 정상에 올라가기 까지 걸리는 일수를 찾는 문제이다.
단, 나무 막대 정상에 도달했을 때는 떨어지지 않는다.(주의)
코드 설명
- 올라가는 길이는 A, 떨어지는 길이는 B, 나무 막대의 높이는 V이다.
- while 문을 사용하여 while문이 false가 될 때 까지 day를 하루에 1씩 증가하였다.
- 당일에 잠을 자기 전 하루동안에 달팽이는 A만큼 오르고 잠을 잔 다음 날에는 B만큼 마이너스가된다.
- 이 방법을 통해 잠일 자기 전까지 일수를 기준으로 나무막대 V보다 낮에 나무막대보다 높이 올라가는 일수를 구하면된다.
- 하지만 while문을 통해 위와 같이 코드를 작성한 결과, 백준에서 시간 초과가 나타났기 때문에 다른 방법을 사용할 수 밖에 없었다.
2차 풀이
코드
import math
A, B, V = map(int,input().split())
day = math.ceil((V-A)/(A-B))+1
print(day)
코드 설명
- 올라가는 길이는 A, 떨어지는 길이는 B, 나무 막대의 높이는 V이다.
- 나무막대 V를 도달하기 위해 걸리는 일수를 day라고 하였을 때, V = (A-B)*day + A가 된다. A만큼 올라갔다가 B 만큼 떨어지기를 day만큼 반복하고 마지막날 나무막대 정상에 도달하였을 때는 떨어지지 않는다.
- 마지막날 올라갈 A 길이를 나무막대 길이 V에서 뺀 길이를 하루동안 올라갈 수 있는 A-B길이로 나누어 V-A까지 올라간 일수를 구한다.
- 이때 나눈 값이 소수인 경우, 소수점 이하는 하루가 소요된 것과 동일하기 때문에 올림을 해야한다.
나눈 값 1.2 -> 2일 소요 - 올림을 하기 위해 math 모듈의 ceil 함수를 사용하여 소수점을 올림한다.
- 그리고 마지막날 A 높이만큼 오르기 때문에 1일을 더하여 결과 day를 출력한다.
반응형