백준 2869번: 달팽이는 올라가고 싶다.
알고리즘 분류: 수학
파이썬(Python) 풀이
링크: https://www.acmicpc.net/problem/2869
문제
땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.
달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.
달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)
출력
첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.
풀이
이 문제를 요약하자면, V미터인 나무를 매일마다 A씩 올라가고 B만큼 내려온다.
또한, 마지막 날은 A만큼 올라가고 끝이 난다.
처음 이 문제를 접했을 때에는, while문을 사용하여 접근하는 경우가 많은 것으로 알고있다.
하지만 100에서 5를 20번 빼는 것 보다는, 100을 5로 나누었을 때의 값을 구하는게 훨씬 연산속도가 빠르다.
따라서 이 문제의 첫번째 포인트는 /(나누기 연산자)라고 생각한다.
또한 두번째 포인트는 마지막 날은 A만큼 올라가는 연산만 해준다는 것이다.
그러면 보통 V에서 마지막날인 A만큼을 뺀 뒤에 A-B로 몫을 구해주면 되지 않느냐? 라는 생각을 할 수도 있다.
따라서 V = (A-B)*n + A로 나타낼 수 있고 n = (V-A)/(A-B)로 나타낼 수 있다.
하지만 이랬을 때의 문제점은 다음과 같다.
5, 2, 10이 입력으로 주어졌을때
n = (10-5)/(5-2) = 5/3 = 1.666...
소숫점이 생긴다는 문제인 것이다. 따라서 1.1나 1.9, 모두 2로 올려주어야 한다는 것을 알 수 있다.
이는 math모듈의 ceil(올림 함수)로 처리할 수 있다.
n의 값을 ceil로 올려주고 마지막 날의 결과인 1을 더하기만 하면 된다.
따라서 n = 1 + math.ceil(V/up)으로 나타낼 수 있다.
'🌀 알고리즘(Algorithm) > 백준(문제 풀이)' 카테고리의 다른 글
[파이썬 풀이] 25345번: 루나의 게임 세팅 - 백준 (0) | 2022.08.17 |
---|---|
[파이썬 풀이] 1152번: 단어의 개수 - 백준 (0) | 2022.08.14 |
[파이썬 풀이] 17202번: 핸드폰 번호 궁합 - 백준 (0) | 2022.07.28 |
[파이썬 풀이] 24039번: 2021은 무엇이 특별할까? - 백준 (0) | 2022.07.19 |
[파이썬 풀이] 2535번: 아시아 정보올림피아드 - 백준 (0) | 2022.07.15 |