일단, 이 문제는 3번 정도 시도를 했는데 한 번은 간단하고 쉽게 풀었다가 시간 초과가 나서, 다른 한 번은 '//' 얘의 사용에 대해 깊게 고민하지 않아서였다.
우선 첫번째 시도는 이렇다.
모두가 할 수 있는 반복문으로 시도해보았다. 당연히 적은 수일 때 답은 잘 나왔지만 예시 3번처럼 큰 수를 넣으니 시간 초과가 났다.
# 2869 달팽이는 올라가고 싶다
A, B, V = map(int, input().split())
H = 0
date = 1
while H < V:
H += A
if H >= V:
break
H -= B
date += 1
print(date)
# 시간 초과가 나왔다.
그래서 반복문을 돌리지 않고 조건문으로만 해결하기 위해, 공통으로 사용할 수 있는 규칙을 찾아내려고 했다.
그래서 생각해보니 어차피 달팽이가 꼭대기에 다다르는 시점은 언제나 오전, 즉 A가 더해질 때이다. 그래서 V에서 A를 빼준 높이를 매일 매일 누적되는 높이인 (A-B)로 나눠준 후, 마지막에 A가 더해지는 날짜를 생각해 +1을 해주는 식을 아래와 같이 짰다.
A, B, V = map(int, input().split())
H = 0
date = 0
if A >= V:
date = 1
elif (A - B) >= (V - A):
date = 2
else:
date = ((V - A) // (A - B)) + 1
print(date)
그런데 이렇게 했더니 중간에 틀림이 떴다. 분명 내가 생각지 못한 반례가 있는 것 같다고 판단하고 여러가지 예시를 생각해보다가 (A = 7, B = 5, V = 10) 일 때를 떠올렸다.
이 경우 달팽이가 꼭대기에 다다르기까지 시간은 3일이다. (1일차 2, 2일차 9, 3일차 10)
만약 내가 만든 식에 대입했을 때, (10 - 7) / (7 - 5) = 3 / 2 = 1.xxx로 1보다 크다. 즉 마지막 날 전에 A-B가 쌓이기 까지 걸리는 날짜는 1일이 아니라 2일이다. 그런데 내가 '//' 이 기호를 사용함으로써 올림이 아니라 버림이 되어버려서 1일로 인식해서 하루가 덜 계산된 것이었다.
'//' 이것의 의미가 버림이라는 것을 잘 기억했어야 하는 문제였다.
'개발 공부 > 알고리즘 문제풀이' 카테고리의 다른 글
[백준] 2775. 부녀회장이 될테야 (0) | 2022.07.27 |
---|---|
[백준] 10250. ACM 호텔 (0) | 2022.07.25 |
[백준] 1193. 분수찾기 (0) | 2022.07.23 |
[백준] 2292. 벌집 (0) | 2022.07.21 |
[백준] 1712. 손익분기점 (0) | 2022.07.21 |