🔗 문제 링크
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미터에 올라갈 때까지 행동을 반복해주면 된다.
📖 처음 생각해낸 풀이 방법
- A, B, V를 입력으로 받는다.
- 달팽이가 정상으로 올라가는 데 걸리는 일수인 day 변수를 선언하고 초기화한다.
- 달팽이가 현재 몇 미터까지 올라갔는지 세는 nail_meter를 선언한다.
- 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를 자주 써야겠다는 생각을 하였다😊
'PS > 백준(BOJ)' 카테고리의 다른 글
[백준] 괄호(9012) - 파이썬(Python) (0) | 2024.03.18 |
---|---|
[백준] 스택 2(28278) - 파이썬(Python) (0) | 2024.03.12 |
[백준] 소수(2581) - 파이썬(Python) (1) | 2024.03.10 |
[백준] 단어 공부(1157) - 파이썬(Python) (1) | 2024.03.06 |
[백준] 단어의 개수(1152) - 파이썬(Python) (1) | 2024.03.03 |