sw사관학교 정글 2기/01 기초,재귀,완전탐색, 정렬
[기초-시간복잡도] ★백준 2869번 달팽이는 올라가고 싶다 with Python3
금의야행
2021. 8. 7. 23:00
https://www.acmicpc.net/problem/2869
2869번: 달팽이는 올라가고 싶다
첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)
www.acmicpc.net
문제
달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.
내 풀이
import sys
import math
a, b, v = map(int, sys.stdin.readline().split())
c = a-b
s = (v-a)/c
print(math.ceil(s)+1)
해설
처음으로 시간복잡도를 고려한 문제. 무려 시간제한이 0.15초 . 비효율적인 for문은 바로 컷이다. 그다지 정돈 되지못했고 완전히 이해하고 풀이를 성공시키지도 못했다. 하지만 맞았으면 되지.
정답 풀이
a,b,v = map(int,input().split())
k = (v-b)/(a-b)
print(int(k) if k == int(k) else int(k)+1)
해석
하지만 if구문의 조건식,
a*k-b*(k-1) => v 를 이항시켜 정리하면 k>=(v-b)/(a-b)로 바꿀 수 있다. 이를 통해 k의 값을 바로 도출 할 수 있다.
-코드
우리는 k,즉 일수를 최소화시켜야 한다. 따라서 k는 (v-b)/(a-b) 혹은 (v-b)//(a-b)+1이다.
답이 두개인 경우는 (v-b)/(a-b)가 분수인 경우가 있기 때문이다.
예를 들어 (v-b)/(a-b)가 4.0인 경우 k는 4이지만, (v-b)/(a-b)가 4.1인 경우 k는 5이다(k는 '일수'다. 즉 4.1일은 없다).
따라서 k=(v-b)/(a-b)로 두고, int(k)와 k가 같다면 k는 (v-b)/(a-b), 다르다면 k는 (v-b)/(a-b)+1이다.
if문으로 float형을 처리할수있다는게 대단하다. 나는 그걸 제대로 접근 못해서 math.ceil을 사용했다.