문제 보기: 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값이 V보다 크거나 같을때 밤에 떨어지는 B도 수행할 필요도 없는 것을 나타냈으며 한사이클을 돌때마다 1이증가하지만 낮에 V를 넘어 버릴때는 2가 증가하게 하는 방식으로 해결하였습니다.
코드2
낮과 밤이라는 함수를 만들어서 풀이하였지만 올라가는 것을 while문으로 돌리면서 수행하여서 시간초과가 되었습니다.
코드
코드1
A, B, V = map(int, input().split())
V = V - A
if V == 0:
print(1)
elif V % (A - B) == 0:
print(V // (A - B)+1)
else:
print(V // (A - B) + 2)
코드2
A, B, V = map(int, input().split())
high = 0
count = 0
def day(high, A, V):
if high + A < V:
high = high + A
else:
high = V
return high
def night(high, B):
if high < 0:
high = 0
else:
high = high - B
return high
while 1:
high = day(high, A, V)
count += 1
if high == V:
break
high = night(high, B)
print(count)
'Algorithm' 카테고리의 다른 글
[백준_2609] 최대공약수와 최소공배수 (0) | 2022.04.25 |
---|---|
[백준_1436] 영화감독 숌 (0) | 2022.04.25 |
[백준_1011] Fly me to the Alpha Centauri (0) | 2022.04.22 |
[백준_4948] 베르트랑 공준 (0) | 2022.04.22 |
[백준_2839] 설탕 배달 (0) | 2022.04.22 |