1) 사이트
2) 문제
정답 비율이 30퍼로 안되는 수준이라 지레 겁을 먹었던 문제이다. 심지어 시간도 0.15초 안에 답을 도출해야 하기 때문에 반복문은 쓰지 않고 오로지 수식을 생각하기 시작했다.
문제는 대략 이러하다.
만약 2 1 5라고 입력을 받는다면, 낮에 2만큼 올라가고, 밤에 1만큼 떨어지면서 최종 크기가 5인 나무에 도달하는 데 며칠이 걸리는지 알려주면 된다.
여기서 주의해야 할 것은 입력의 범위에 나무의 크기와 올라가는 정도가 같을 수도 있기 때문에 1이라는 답이 나올 수도 있다는 것이다.
*중요점!*
내가 생각한 수식은 이러하다.
1번. 2 1 5일 때, 크기가 5가 되는 나무는 결국 낮 밤을 거쳐 3 정도 왔다면 다음 날 바로 정상에 오를 수 있다. -> 5 - 2 = 3
2번. 하루에 올라갈 수 있는 길이는 2x-1x이다. 즉, x이다.
결론은 2x-1x = 5 - 2 이므로 x=3이 나오기 때문에 +1 해주면 총 4일이 걸린다는 것을 알 수 있었다.
이것을 수식으로 표현하면, (총 길이 - 올라가는 길이)/(올라가는 길이 - 내려가는 길이)이다.
여기서 중요한 것은 분자가 0이면 하루만에 올라갈 수 있다는 소리이므로 결과는 1이다.
위의 수식 값이 1보다 작으면, 다음날에 골에 들어갈 수 있다는 소리이므로 결과는 2이다.
위의 수식 값이 1보다 크면, 해당 수식 값에 +1을 한 만큼의 날이 걸린다.
단, 1.xx일 같은 경우는 올림으로 2일로 쳐야한다.
3) 파이썬 코드
import math
result=0
up,down,length=input().split(' ')
if up==length:
result=1
elif (int(length)-int(up))/(int(up)-int(down))<1:
result=2
else:
result=int(math.ceil(((int(length)-int(up))/(int(up)-int(down))))+1)
print(result)
3-1) 선수 지식
파이썬 코드를 이해하기 위해 알아야 할 선수 지식이 있습니다.
1. 여러 입력을 한 줄에 받고 변수로 나눠 받는 방법
-> 변수1, 변수2, 변수3 = input().split(' ')
2. 소수점 올림, 반올림, 내림하는 방법
->반올림 : round(수)
import math
->올림 : math.ceil(수)
->내림 : math.floor(수)
3-2) 설명
1. 사용할 변수를 선언 및 초기화해줍니다.
result=0
최종 결과값을 저장할 변수를 0으로 초기화해줍니다.
2. 올라갈 길이, 내려갈 길이, 총 나무 길이를 받습니다.
up,down,length=input().split(' ')
3. 올라갈 길이와 총 나무 길이가 같을 때 결과를 1이라고 저장합니다.
if up==length:
result=1
4. 위에서 언급한 수식이 1보다 작을 때 결과를 2라고 저장합니다.
elif (int(length)-int(up))/(int(up)-int(down))<1:
result=2
5. 위에서 언급한 수식이 1보다 클 때 수식에 따라 결과를 저장합니다.
else:
result=int(math.ceil(((int(length)-int(up))/(int(up)-int(down))))+1)
6. 결과를 출력합니다.
print(result)
4) c언어
아직~
궁금한 점이나 공유할 정보가 있다면 댓글로 남겨주세요 *^^*
끝!
'알고리즘 > 백준' 카테고리의 다른 글
2775번 부녀회장이 될테야 (0) | 2021.06.06 |
---|---|
10250번 ACM 호텔 (0) | 2021.06.02 |
1193번 분수찾기 (0) | 2021.05.30 |
2292번 벌집 (0) | 2021.05.30 |
1712번 손익분기점 (0) | 2021.05.29 |