[백준] Baekjoon Online Judge
문제
경찰대학 용인캠퍼스에는 나무 한 그루가 있다. 경찰대학생이 떠나간 용인캠퍼스의 토지는 매우 비옥해서 나무가 잘 자란다. 나뭇가지는 나무의 중심 줄기에서 아래와 같은 규칙을 이용해서 뻗어나온다.
- 나뭇가지는 자랄 때마다 한 번에 2갈래로 갈라지면서 성장한다. 예를 들어, 중심줄기에서 나온 첫 번째 가지의 개수는 2개이며, 두 번째 가지의 총 개수는 첫 번째 가지의 수에 2를 곱해 4개이다.
- N번째 나뭇가지의 길이는 N-1번째 나뭇가지의 길이의 R/100배이고, 소수점 이하는 버린다. 0번째 나뭇가지는 중심줄기이다.
- N번째 나뭇가지의 길이가 5cm 이하가 되는 경우, N-1번째 가지에서 성장을 멈춘다.
중심 줄기의 길이 L이 입력으로 주어졌을 때, 중심 줄기를 제외한 나뭇가지의 길이의 합을 구하시오.
입력
첫 번째 줄에 중심 줄기의 길이 L(6 ≤ L ≤ 10,000)이 주어진다. 둘째 줄에 비율 R(1 ≤ R ≤ 99)가 주어진다. L의 단위는 cm이다.
출력
첫 번째 줄에 중심 줄기를 제외한 나뭇가지의 총 길이의 합을 cm단위로 출력하며, 소숫점 이하는 버린다. 총 길이의 합이 106보다 작거나 같은 입력만 주어진다.
풀이
#include <iostream>
#include <cmath>
using namespace std;
int tree(int len, double r);
int tree(int len, double r) {
int result = 0; // 나뭇가지의 총 길이
int cnt = 1; // 새로 자라는 나뭇가지의 수
while (true) {
cnt *= 2;
len = floor(len * r);
// 나뭇가지의 길이가 5cm 이하가 되는 경우
if (len <= 5) break;
result += (len * cnt);
}
return result;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int L, R;
cin >> L >> R;
cout << tree(L, R / 100.0) << '\n';
return 0;
}
int tree(int len, double r) {
int result = 0; // 나뭇가지의 총 길이
int cnt = 1; // 새로 자라는 나뭇가지의 수
while (true) {
cnt *= 2;
len = floor(len * r);
// 나뭇가지의 길이가 5cm 이하가 되는 경우
if (len <= 5) break;
result += (len * cnt);
}
return result;
}
중심 줄기를 제외한 나뭇가지의 총 길이를 구하는 함수이다. 소수점을 버리기 위해 <cmath>의 floor()함수를 사용하였다.
cout << tree(L, R / 100.0) << '\n';
메인 함수에서 함수를 호출하는 부분의 코드이다. 두번째 매개변수가 double이고, 소수점이 필요한 데이터이므로 int형인 100대신 100.0으로 R을 나눴다.
'백준 > C++' 카테고리의 다른 글
[Baekjoon/C++] 3595번 - 맥주 냉장고 (0) | 2025.04.14 |
---|---|
[Baekjoon/C++] 11504번 - 돌려 돌려 돌림판! (0) | 2025.04.12 |
[Baekjoon/C++] 5032번 - 탄산 음료 (0) | 2025.04.11 |
[Baekjoon/C++] 11505번 - 구간 곱 구하기 (0) | 2025.04.10 |
[Baekjoon/C++] 29615번 - 알파빌과 베타빌 (0) | 2025.04.09 |