본문 바로가기
Learning-log/Algorithm 문풀

백준(파이썬, python) - 2869번 달팽이는 올라가고 싶다(2022.11.05)

by why제곱 2022. 11. 6.

1. 2869번

 

1) 문제

 

2) 풀이

import sys
A, B, V = map(int,sys.stdin.readline().split())

if (V-A)%(A-B) == 0:
    print((V-A)//(A-B)+1)
else: 
    print((V-A)//(A-B)+2)

 

3) 문법 및 풀이과정

맨 처음에 이 문제를 보고 while문을 활용해서 코드를 짰다. 비교적 작은 수에 있어서는 답이 틀리게 나오진 않았으나, 예제 입력 3을 테스트하자마자 결과값이 바로 안나오고 시간이 걸렸다. 무조건 시간초과가 나올 거라는 생각에 다시 코드를 살펴보니 주어진 입력값이 클수록 시간 복잡도가 커지고 주어진 문제의 시간 조건이 그렇게 많지도 않기 때문에 더 간단한 코드를 찾아야 했다.

A -B A -B A -B 가 나열되는 수열이고 몇 번째에서 처음으로 V를 초과하느냐가 관건이었다. 조금만 더 생각해보니, -B에서 V를 처음으로 초과할 리는 절대 없다. 이걸 아이디어로 삼아 A-B로 나눈다 하더라도 그 끝이 절대 -B가 안되도록 세팅해야겠다는 생각이 들었고 따라서 V-A를 A-B로 나눠야겠다는 결론이 나왔다. V에서 A를 빼면 이미 A만큼 올라간 상태에서 A-B만큼 전진하는 것이므로 (다르게 설명하자면 -B만큼 갔다가 +A만큼 가는 것으로 +A가 나중에 발생한다.) V-A를 A-B로 나눈 몫을 이용해 나무막대를 올라가는 데에 걸리는 시간을 구할 수 있었다.

다만 주의할 점은, V-A가 A-B로 나누어 떨어질 때는 맨 처음에 V에서 A를 뺀 하루치에 해당되는 1을 더해줘야하고 나누어 떨어지지 않을 때는(즉, 나머지가 있다는 뜻으로 달팽이가 한번 더 전진해야 꼭대기에 도달한다.) V-A에 A에 해당하는 1과 나머지를 올라가기 위한 또 한번의 전진(+1)을 더하여 총 +2만큼을 더 더해줘야 한다.