백준/C++
[Baekjoon/C++] 17283번 - I am Groot
베리._.
2025. 4. 13. 19:28
[백준] 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을 나눴다.