IT/알고리즘

[BAEKJOON] 백준 2869번: 달팽이는 올라가고 싶다 (Python)

무녈 2021. 8. 23. 09:18

문제 링크: 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)

출력

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


1차 풀이

코드

A, B, V = map(int,input().split())
day = 1

while V > A*(day) - B*(day-1):
    day += 1

print(day)

문제 요약

  1. 높이가 V인 나무 막대를 A만큼 올랐다 B만큼 떨어지기를 반복하며 나무 막대 정상에 올라가기 까지 걸리는 일수를 찾는 문제이다.
    단, 나무 막대 정상에 도달했을 때는 떨어지지 않는다.(주의)

코드 설명

  1. 올라가는 길이는 A, 떨어지는 길이는 B, 나무 막대의 높이는 V이다.
  2. while 문을 사용하여 while문이 false가 될 때 까지 day를 하루에 1씩 증가하였다.
  3. 당일에 잠을 자기 전 하루동안에 달팽이는 A만큼 오르고 잠을 잔 다음 날에는 B만큼 마이너스가된다.
  4. 이 방법을 통해 잠일 자기 전까지 일수를 기준으로 나무막대 V보다 낮에 나무막대보다 높이 올라가는 일수를 구하면된다.
  5. 하지만 while문을 통해 위와 같이 코드를 작성한 결과, 백준에서 시간 초과가 나타났기 때문에 다른 방법을 사용할 수 밖에 없었다.

2차 풀이

코드

import math

A, B, V = map(int,input().split())

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

print(day)

코드 설명

  1. 올라가는 길이는 A, 떨어지는 길이는 B, 나무 막대의 높이는 V이다.
  2. 나무막대 V를 도달하기 위해 걸리는 일수를 day라고 하였을 때, V = (A-B)*day + A가 된다. A만큼 올라갔다가 B 만큼 떨어지기를 day만큼 반복하고 마지막날 나무막대 정상에 도달하였을 때는 떨어지지 않는다.
  3. 마지막날 올라갈 A 길이를 나무막대 길이 V에서 뺀 길이를 하루동안 올라갈 수 있는 A-B길이로 나누어 V-A까지 올라간 일수를 구한다.
  4. 이때 나눈 값이 소수인 경우, 소수점 이하는 하루가 소요된 것과 동일하기 때문에 올림을 해야한다.
    나눈 값 1.2 -> 2일 소요
  5. 올림을 하기 위해 math 모듈의 ceil 함수를 사용하여 소수점을 올림한다.
  6. 그리고 마지막날 A 높이만큼 오르기 때문에 1일을 더하여 결과 day를 출력한다.
반응형