문제
땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.
달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.
달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000)
출력
첫째 줄에 달팽이가 나무 막대를 모두 올라가는데 며칠이 걸리는지 출력한다.
풀기 전 로직 생각
- 나무높이 , 낮에 올라가는 높이, 밤에 미끄러지는 높이를 입력받는다.
- 현재 올라가있는 높이를 0으로 초기화하고 낮에 올라간 높이만큼 더한 후 그 높이가 나무높이보다 크거나 같으면 종료시키고 아닐경우 밤에 미끄러질 높이만큼 빼준 후 날을 증가시킨다.
코드
#include <iostream>
using namespace std;
int main() {
int height; //나무 높이
int day; //낮에 올라가는 높이
int night; //밤에 미끄러지는 높이
cin >> day >> night >> height;
int count_day = 1;
int now_height = 0;
while (true) {
now_height += day;
if (height <= now_height) {
break;
}
now_height -= night;
count_day++;
}
cout << count_day;
return 0;
}
풀고 난 후 찾아본 것
풀어보고 나서 이게 최적의 계산일까 하며 질문계시판도보고 검색해봤는데 최소한으로 단 한줄만에 계산이 되더라구요.. 알아갈수록 신기한 수학의 세계...
최소한으로 계산하는 로직
#include <iostream>
using namespace std;
int main() {
int height; //나무 높이
int day; //낮에 올라가는 높이
int night; //밤에 미끄러지는 높이
cin >> day >> night >> height;
int raise = day - night; //순수 올라가는 높이
int count_day = (height - day + raise - 1) / raise + 1; //최소한의 계산
cout << count_day;
return 0;
}
height - day를 하는 이유: 마지막 날에 달팽이가 낮에 정상을 도달하는 높이를 제외한 나머지 높이
raise : 하루 동안 달팽이가 실제로 올라가는 순수 높이
height - day + raise -1 : height - day를 나눌때, 나누어 떨어지지 않는 경우를 고려하기위해 -1을 해서 올림 효과를 내기 위함.
/ raise : 나머지 높이를 하루 동안 올라가는 순수 높이로 나눠서 며칠이 걸리는지 계산
+1 : 마지막날 더해준다.
아직 갈길이 멀다...
'백준' 카테고리의 다른 글
[백준] 2501번 - 약수 구하기 C++ (0) | 2024.05.18 |
---|---|
[백준] 5086번 - 배수와 약수 C++ (0) | 2024.05.18 |
[백준] 1193번 - 분수찾기 C++ (0) | 2024.05.14 |
[백준] 2903번 - 중앙 이동 알고리즘 C++ (0) | 2024.05.13 |
[백준] 2720번 - 세탁소 사장 동혁 C++ (0) | 2024.05.09 |