Study/백준코테

5. 백준 코딩테스트 2869번 문제 python

코딩 잘 할거얌:) 2021. 9. 18. 01:34
반응형

이번에는 기본 수학 1에 관련된 문제에서 제목이 '달팽이는 올라가고 싶다'으로 되어있는 문제를 풀었다. 정답률이 28%대이다.

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

 

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

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

www.acmicpc.net

 

코딩에 들어가기 앞서 관계식을 따져보자.

나무 막대 길이를 V라고 하고

달팽이가 낮에 올라가는 길이를 A

밤에 미끄러지는 B 라고 하고,

달팽이가 올라간 수를 n이라고 하자.

이때 달팽이가 n일만큼 올라갔다고 했을 때 나오는 관계식은 다음과 같다.

$$A*n - B*(n-1)$$

n에 관련된 식으로 정리한 후 나무 막대 길이 부등식을 붙여보자.

$$n(A-B) + B \geq V$$

좌변을 n만 남기고 전부 정리하면 다음과 같다.

$$n \geq (V - B)/(A-B)$$

물론 부등호에 관련해서 나눗셈은 양수 음수를 따져야 하지만, 이 경우에는 문제에서 이미 자연수만 다루는 걸로 명시되어있으므로 생략해도 무방하다.

이렇게 하고 코딩을 하면 된다. 단 우변이 소수점이 나올 수 있으므로 소수점을 올림을 하거나 소수점 발생하면 1을 더해주는 식을 만들어야 한다.

 

receive_input = input().split()
snail_climb = int(receive_input[0])
snail_fall = int(receive_input[1])
stick_height = int(receive_input[2])


#우변이 소수점이 발생하는 지 체크한다.
if (stick_height - snail_fall) % (snail_climb - snail_fall) == 0:

    #자연수로 떨어진다면, 하루에 갈 수 있는 거리 딱 맞게 나무 막대 정상에 도착한다는 뜻이다.
    print((stick_height - snail_fall)//(snail_climb - snail_fall))
    
else:
	# 소수점이 발생하면, 하루에 갈 수 있는 거리 중간에 나무 막대 정상에 도착한다는 뜻이다.
    print(((stick_height - snail_fall)//(snail_climb - snail_fall))+1)

 

이렇게 해결하면 된다. 다만 문제 해결 중 오류가 떴었는데, 식을 정리하지 않고 반복문으로 해결을 해서 오류가 발생했다. 아마 이러한 이유로 사람들이 많이 오류 났던 것 같다.

 

반복문을 사용해서 시간초과가 발생했다.

 

반복문을 최대한 사용하지 않고 식을 먼저 정리하는 습관을 가져야 할 것 같다.

728x90