2023. 4. 12. 20:26ㆍ백준
문제
땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.
달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.
달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)
출력
첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.
## 2869 달팽이는 올라가고 싶다
a,b,v=map(int,input().split())
current,day=0,0
while current<v-b:
current+=a
current-=b
day+=1
print(day)
현재위치를 막대의 길이랑 계속 비교해 주면서 갱신하는 코드를 짰는데 낮에 도착하는 경우를 생각못해서 틀렸다고 뜬다.
a,b,v=map(int,input().split())
current,day=0,0
while True:
if current>=v:
print(day)
break
else:
current+=a
if current>=v:
day+=1
print(day)
break
current-=b
day+=1
낮에 움직이고 나서도 한 번 조건을 확인하도록 수정했는데 막대의 길이가 많이 길면 엄청 오래 걸린다..
그래서 수학적으로 접근했음.
낮에 도착하는 경우가 있을 수도 있으니까 막대의 길이를 그냥 b만큼 빼주고 시작한다.
하룻동안 (a-b)만큼 올라간다. 그러면 걸리는 시간은 (v-b)/(a-b)일 이다. 하지만 나누어 떨어지지 않는 경우는 하루를 더 가줘야 함으로 math라이브러리를 이용해 올림함수 ceil()을 사용해준다.
import math
a,b,v=map(int,input().split())
min(math.ceil(v/(a-b)),math.ceil((v-b)/(a-b)))
1. 밤까지 이동해서 도달하는 경우 v/(a-b)
2. 낮까지 이동해서 도달하는 경우 (v-b)/(a-b)
*안나누어떨어질 경우 하루 더 가야 하니까 math.ceil()해주고 min()으로 더 빨리 도착하는 날로 출력.
근데 틀림.. 질문게시판에 나와있는 다른 반례들 다 해봤는데 답은 다 맞게 나왔다... 반례를 결국 못찾았지만 자꾸 틀렸다고 하니까..
그래서 생각해보니 ceil해줄거면 굳이 1, 2경우를 나누어줄 필요가 없고 처음부터 v-b를 나누어 주면 될 것 같아서 해보니까 맞았다!
(그래도 위에 코드는 뭐가 틀렸는지 모르겠다..)
import math
a,b,v=map(int,input().split())
print(math.ceil((v-b)/(a-b)))
코드길이는 짧은데 시간이 오래걸린다. 이유는! 모르겠다!
'백준' 카테고리의 다른 글
백준 4673_셀프넘버 / Python (1) | 2024.01.10 |
---|---|
백준 1463_1로 만들기 / Python (0) | 2023.08.28 |
백준 2775_부녀회장이 될테야~! / Python (0) | 2023.04.12 |
백준 2609_최대공약수와 최소공배수 / Python (0) | 2023.04.12 |
백준 1259_팰린드롬수 / Python (0) | 2023.04.10 |