python/algorithm

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

Balang 2025. 5. 27. 09:56
728x90

문제 개요

문제 링크: https://www.acmicpc.net/problem/2869

 

문제를 설명하자면 어느 날 달팽이가 우물을 올라가기로 결심했습니다.

하지만 이 우물의 높이는 V미터이고, 달팽이는 다음과 같은 규칙으로 이동합니다.

  • 낮에 A미터 올라감
  • 밤에 B미터 미끄러짐

이 행동을 반복하면서, 달팽이는 언젠가 꼭대기에 도달하고 말 겁니다.

여기서 질문은 이 달팽이는 며칠 만에 우물 꼭대기에 도달할까요?

 

예를 들어 입력이

2 1 5

 

이 들어왔다면

  • 낮에 2미터 올라가고
  • 밤에 1미터 미끄러지고
  • 우물의 높이는 5미터라는 뜻입니다.

진행과정을 자세하게 살펴보겠습니다.

날짜 아침에 올라감 저녁에 미끄러짐 위치
1일차 +2 -1 1
2일차 +2 -1 2
3일차 +2 -1 3
4일차 +2 -1 4
5일차 +2 도착! 6

 

그럼 최종적인 정답은 5일이 됩니다.

 

여기서 핵심은 도착한 마지막날에는 미끄러지지 않는다는 점입니다.

달팽이는 아침에 올라가고, 만약 올라간 후 꼭대기 이상이라면 그날로 끝입니다.

따라서 밤에 미끄러지는 것은 "도착 전까지만" 고려하면 됩니다.

 

수학 공식으로 살펴보면

  • 하루에 실제로 올라가는 양 = (A - B)
  • 도착 직전까지 올라가야 하는 높이 = (V - A)
  • 그럼 (A - B)로 나눈 뒤, 마지막 하루를 더해주면 됩니다.

$$ \begin{bmatrix} V - A \\ A - B \\ \end{bmatrix} + 1 $$

 

이제 python으로 문제를 풀어보겠습니다.

import sys
import math

def solve():
    # A: 낮에 올라가는 거리, B: 밤에 미끄러지는 거리, V: 총 높이
    A, B, V = map(int, sys.stdin.readline().split())

    # 핵심 개념:
    # 마지막 날에는 미끄러지지 않기 때문에,
    # V - A 만큼을 매일 (A - B)만큼 이동한다고 보고,
    # 그걸 올림해서 일수 계산 후 +1 해주면 된다.

    days = math.ceil((V - A) / (A - B)) + 1

    print(days)

if __name__ == "__main__":
    solve()

 

핵심 코드는 `days = math.ceil((V - A) / (A - B)) + 1` 이 부분 입니다.

  • `(V - A)`는 마지막 날을 제외한 거리
  • 하루에 `A - B` 만큼 올라감 → 이만큼 반복하면 마지막 날 도달 가능
  • `+1`은 마지막 날 “올라간 후 미끄러지지 않는” 하루

 

 

728x90
반응형