개발 공부/알고리즘 문제풀이

[백준] 2869. 달팽이는 올라가고 싶다

5묘 2022. 7. 25. 00:15
 

2869번: 달팽이는 올라가고 싶다

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

www.acmicpc.net


일단, 이 문제는 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