◯문제 링크◯
◯코드 미리보기◯
정답코드 :
from math import ceil
A,B,V = map(int,input().split( ))
N=(V-A)/(A-B)
C = ceil(N)
print(C+1)
시간초과 코드 :
A,B,V = map(int,input().split( ))
N=1
while(1):
if (V <= (A-B)*N+A):
print(N+1)
break
N += 1
◯설명◯
이 문제는 예전에 책에서 읽어본적이 있는 문제라서 수식을 생각하는데 어렵지 않았다.
그냥 하루가 지날 때 마다 A-B(올라가는 높이 - 내려가는 높이)만큼 증가하고, 마지막 날에는 끝까지 도달하면 내려오지 않으니까 B를 뺄 필요없이 A만 더해주면 된다.
그래서 나온 식이 바로 [V <= (A-B)*N+A] 이다.
주의할 점은, 마지막에 A를 더해준다는 것은 하루가 더 지난다는 것이기 때문에 나온 N의 값에도 1을 더해주어야 한다는 점이다.
이전 문제들에서 반복을 두려워하지 않기로 했기 때문에, 일단 반복을 통해 일수(N)을 증가시키면서 조건에 일치하는 N을 찾는 코드를 만들어 보았다.
그렇게 해서 나온 코드가 바로 다음의 코드이다.
A,B,V = map(int,input().split( ))
N=1
while(1):
if (V <= (A-B)*N+A):
print(N+1)
break
N += 1
그러나 이번에는 반복을 사용하면 안되는 것인지 시간초과가 발생했다.
그래서 생각한것이 앞서 말한 수식에는 값이 들어있지 않은 변수가 N하나밖에 없으니까 N의 값을 아예 계산해버리면 되지 않을까라는 생각이다.
이렇게 해서 나온 수식이 [N=(V-A)/(A-B)]이다.
다만 이 수식을 그대로 사용하면 이전식에서 사용했던 N의 값이랑 동일하게 나오지 않는다.
이전 식에서는 괄호를 사용해서 정수값을 얻을 수 있었는데, 이번에는 등호를 사용하기 때문에 값이 정수로 딱 떨어지지 않는다. 여기서 짚고 넘어가야 할 점은 소수점이 존재한다는 것은 이미 하루가 시작됬다는 것이다. 따라서 올림을 사용해주어야 한다. 여기에 기존의 식 자체가 계산과는 별개로 마지막날 하루가 존재하기 때문에 N의값에 1을 더해주어야한다.
그래서 나온 코드가 다음의 코드이다.
from math import ceil
A,B,V = map(int,input().split( ))
N=(V-A)/(A-B)
C = ceil(N)
print(C+1)
여기서 올림으로 사용한 함수가 ceil인데, 이 함수는 python내장함수가 아니기 때문에 math모듈에 등록되어 있는 ceil함수를 가져와야 한다.
이를 위해 사용한 코드가 첫번째줄의 from import 구문이다.
◯배운 것◯
⩥from 모듈 import 함수를 사용하면 모듈에서 사용할 함수를 등록했다.
⩥수식에서 변수가 하나일 경우에는 바로 값을 계산해보는 것도 좋은 방법이다.
'python > 문제' 카테고리의 다른 글
[백준,2775]부녀회장이 될테야! (0) | 2021.01.31 |
---|---|
[백준/10250]ACM 호텔 (0) | 2021.01.30 |
[백준/1193]분수찾기 (0) | 2021.01.27 |
[백준/2292]벌집 (0) | 2021.01.26 |
[백준/1712]손익분기점 (0) | 2021.01.23 |