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
ⓒ ⓞ ⓓ ⓔ
ⓣ ⓔ ⓢ ⓣ
ⓕ ⓘ ⓝ ⓐ ⓛ ⓒ ⓞ ⓓ ⓔ
'Python ◡̈ > 차근차근 Python' 카테고리의 다른 글
[programmers python] 43238 입국심사 (0) | 2021.05.19 |
---|---|
[백준 python] 10250 ACM 호텔 (0) | 2021.05.14 |
[programmers python] 43236 징검다리 (0) | 2021.05.12 |
[백준 python] 10757 큰 수 A+B (0) | 2021.05.11 |
[백준 python] 2839 설탕배달 (0) | 2021.05.11 |