문제 링크: 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를 출력한다.
반응형
'IT > 알고리즘' 카테고리의 다른 글
[BAEKJOON] 백준 2775번: 부녀회장이 될테야 (Python) (0) | 2021.08.24 |
---|---|
[BAEKJOON] 백준 10250번: ACM 호텔 (Python) (0) | 2021.08.23 |
[BAEKJOON] 백준 1193번: 분수찾기 (Python) (0) | 2021.08.21 |
[BAEKJOON] 백준 2292번: 벌집 (Python) (0) | 2021.08.20 |
[BAEKJOON] 백준 1712번: 손익분기점 (Python) (0) | 2021.08.19 |
댓글