티스토리 뷰

 

[Python] 백준 알고리즘 온라인 저지 2869번 : 달팽이는 올라가고 싶다

 

Python3 코드

import math

a, b, v = map(int, input().split())
# a= 올라가는 길이, b= 떨어지는길이, v= 나무높이 

day = math.ceil((v-a)/(a-b)) + 1
print(day)

 

 

Python3 코드 풀이

 

1. 코드 풀이 전체적인 내용 요약

이번 문제는 나무 높이가 v인 나무가 있을 때 a만큼 올라갔다가 b만큼 떨어지길 반복해서 나무 정상에 도달하기까지 걸리는 날짜를 출력하는 문제이다. 

 

문제를 풀 때에 주의해야 할 점은 나무 정상에 도달하게 되면 떨어지지 않는다는 것이다. 그래서 단순히 a-b를 구한 값을 나무높이 v에서 나누게 되면 정답을 맞힐 수 없다. 이 한 가지만 주의하면 단순한 수학 문제이기 때문에 어렵지 않게 문제를 풀 수 있다. 

 

2. 코드 상단, 입력받는 세 개의 수에 변수를 선언한다. 

a, b, v = map(int, input().split())
# a= 올라가는 길이, b= 떨어지는길이, v= 나무높이 

문제에서 제시한 알파벳을 그대로 변수로 사용하였다. 올라가는 길이는 a,  떨어지는 길이는 b, 나무높이는 v로 지정하여 입력받은 세 개의 수를 각각의 변수에 선언하였다.

 

3. 나무 정상에 도달하기까지 걸리는 날짜를 계산한다.

day = math.ceil((v-a)/(a-b)) + 1

날짜를 계산한는 식을 작성하기 전, 먼저 나무 높이를 기준으로 하는 식을 작성해보면 (a-b)*n +a = v와 같다. a만큼 올랐다 b만큼 떨어지기를 반복하기 때문에 a-b의 거리만큼 올라가는 것을 n만큼 반복하고 마지막 날에는 a만큼 올라가고서 더 이상 떨어지지 않기 때문이다.

 

나무높이인 v를 기준으로 작성한 식을 응용하여 나무에 도달하기까지 걸린 기간을 구하면 위에 작성한 코드와 같다. 나무높이에서 마지막 날에 올라간 거리를 뺀 수에서 a-b를 나누면 마지막에 a만큼 올라간 하루를 제외한 날짜를 구할 수 있다.

 

이때 나누는 수가 소수인 경우 소수점 이하는 날짜로 보면 하루가 걸린 것과 같기 때문에 math 모듈의 올림 기능을 하는 ceil 함수를 사용해서 소수를 올림 하여 정수로 반환한다. 그리고 마지막에 a만큼 올라간 날을 빼주어서 날짜 기준으로는 하루를 뺀 것과 같기 때문에 +1을 해주었다.

 

4. 참고로 math 모듈에 대해서

import math

math 모듈을 이용하면 수학과 관련된 함수들을 사용할 수 있다. ceil 함수를 이용하면 소수를 올림 하는 정수를 반환하고 반대로 소수를 내림한 정수를 반환할 때는 floor를 이용한다. ceil은 천장, floor는 바닥을 의미한다고 생각하면 기억하기가 쉽다.

 

필요한 모듈을 불러들일 때는 import문을 사용해서 불러들이면 되고 보통 코드의 가장 윗줄에 import 문을 작성한다. math모듈은 ceil과 floor 함수 이외에도 사인, 코사인 제곱근을 구하는 등의 수학 계산을 해주는 함수들을 사용할 수 있다.

 

반응형
댓글
반응형