본문 바로가기

Python ◡̈/차근차근 Python

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

 

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

 

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

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

www.acmicpc.net

 

 

<problem>

 

 

땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.

달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.

 

달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.

 

 

<input>

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

<output>

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


 

<example>

 


 

<solution ①>시간초과 발생

 

- 세 수를 한 줄에 입력받아 각각 정수형으로 변환하여 각 변수에 저장

- days, height 변수 값을 0으로 초기화한 후, while문 통해 height와 목표 도달 높이인 V 값 비교

- while문은 height가 V보다 낮을 경우 반복

    - height += A

    - days += 1 ; 먼저 하는 이유는 목표 높이에 도달하면, 미끄러지지 않기 때문에 걸린 날 먼저 연산 수행

    - if height < V: height -= B

    - else: print(days)

 


 

ⓒ ⓞ ⓓ ⓔ

 

 


 

ⓣ ⓔ ⓢ ⓣ

 


생각보다 코드가 빨리 구현되어서

그냥 실행해보았는데 시간 초과 발생 ,, 또륵

 

그래서 어떻게 할지 고민하다가

input 보다는 stdin.readline( ) 함수가 더 빠르다고 하길래 해당 함수로 구현

 


 

ⓒ ⓞ ⓓ ⓔ

 


 

ⓣ ⓔ ⓢ ⓣ

 


이번에도 시간 초과 발생 ,, 

그래서 아예 전혀 다른 방법으로 생각해보았다.

 


 

<solution ②> 성공 코드

 

- 처음처럼 한 줄에 입력받아 바로 변수 A, B, V에 각각 저장

- if문 통해 한번에 계산 후 비교하여 days에 값 저장 후 출력

    - A만큼 올라갔다가 B만큼 미끄러지기 때문에 하루에 올라가는 높이는 A-B 이다.

    - 그래서 조건을 어떻게 하느냐! 도달하면 미끄러지지 않으므로 (V-B) 에서 하루에 올라가는 높이로 나누어주기!

    - if (V-B) % (A-B) != 0: 아직 도달하지 못했으므로 days+1

    - else: (V-B) // (A-B) = days

 


 

ⓒ ⓞ ⓓ ⓔ

 


 

ⓣ ⓔ ⓢ ⓣ

 


 

ⓕ ⓘ ⓝ ⓐ ⓛ    ⓒ ⓞ ⓓ ⓔ