[백준] 달팽이는 올라가고 싶다(2869) - 파이썬(Python)

🔗 문제 링크


https://www.acmicpc.net/problem/2869

 

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

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

www.acmicpc.net

 

문제 설명
땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다. 달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다. 달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.

 

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

 

출력
·  첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.

 

풀이 과정


❓ V미터까지 올라가는데 달팽이가 걸리는 일수를 확인할려면?
→ ✅ 하루가 지날 때마다 올라가는데 걸리는 일수를 하나씩 더하면서 V미터에 올라갈 때까지 행동을 반복해주면 된다.

 

📖 처음 생각해낸 풀이 방법

  1. A, B, V를 입력으로 받는다.
  2. 달팽이가 정상으로 올라가는 데 걸리는 일수인 day 변수를 선언하고 초기화한다.
  3. 달팽이가 현재 몇 미터까지 올라갔는지 세는 nail_meter를 선언한다.
  4. nail_meter가 V일 때까지 반복한다.

⬇️ 전체 코드

import sys
input=sys.stdin.readline

#1. `A, B, V`를 입력으로 받는다.
A,B,V=map(int,input().split())

#2. 달팽이가 정상으로 올라가는 데 걸리는 일수인 `day` 변수를 선언하고 초기화한다.
#3. 달팽이가 현재 몇미터까지 올라갔는지 세는 `nail_meter` 를 선언한다.
day=0
nail_meter=0

#4. `nail_meter`가 `V`일 때까지 반복한다.
while nail_meter<=V:
    day+=1
    nail_meter+=A
    if nail_meter>=V:
        break
    nail_meter-=B
    
print(day)

→ 답은 정확하게 출력되었지만 시간 초과라고 떴다. 이러한 방식은 V가 매우 큰 경우 계산 시간이 많이 걸린다고 하였다.

💡그래서 시간을 줄일 수 있는 방법을 생각해보다가 ceil 자료형을 이용한 풀이 방법이 떠올랐다.

 

📖 ceil() 자료형을 이용한 풀이 방법

  A, B, V 를 입력으로 받고 ceil 자료형을 이용해 바로 걸리는 일수를 출력해준다.

⬇️ print(math.ceil((V - A) / (A - B)) + 1) 부분
  • V - A: 달팽이가 가야 할 총 거리에서 첫 날에 달팽이가 오를 수 있는 거리를 빼는 부분이다.
  • A - B: 달팽이가 하루에 실제로 이동할 수 있는 거리를 나타낸다. 달팽이는 낮에 A만큼 올라가지만 밤에 B만큼 내려오므로, 하루 동안 달팽이가 실제로 이동하는 거리는 A - B 이다.
  • (V - A) / (A - B): 달팽이가 V - A 거리를 A - B의 속도로 이동하는 데 필요한 시간을 나타낸다. 달팽이가 이동해야 하는 거리를 하루 이동 거리로 나누어 필요한 일수를 계산한다.
  • math.ceil(): 괄호 안의 수를 올림한다. (V - A) / (A - B)의 결과가 정수가 아닌 경우, 즉 달팽이가 마지막 날에 목표치에 도달하지 못하고 조금만 더 올라가면 도달할 수 있는 상황을 고려하여 올림 처리를 한다.
  • math.ceil((V - A) / (A - B)) + 1: 첫 날을 제외한 나머지 일수에 첫 날을 더한 것이다. 첫 날에 달팽이는 A만큼 오르고 밤에 내려오지 않으므로, 이를 고려하여 1일을 더한다.

 

👩‍💻 최종 코드


import sys
import math
input=sys.stdin.readline

A, B, V = map(int,input().split())
print(math.ceil((V - A) / (A - B)) + 1)

 

📚 새로 알게 된 점


사용자의 입력을 더 빠르게 받아 프로그램의 실행 시간을 줄이기 위해 sys를 자주 써야겠다는 생각을 하였다😊