본문 바로가기

백준/C++

[Baekjoon/C++] 17283번 - I am Groot

[백준] Baekjoon Online Judge

문제로 이동

 

문제

경찰대학 용인캠퍼스에는 나무 한 그루가 있다. 경찰대학생이 떠나간 용인캠퍼스의 토지는 매우 비옥해서 나무가 잘 자란다. 나뭇가지는 나무의 중심 줄기에서 아래와 같은 규칙을 이용해서 뻗어나온다.

  1. 나뭇가지는 자랄 때마다 한 번에 2갈래로 갈라지면서 성장한다. 예를 들어, 중심줄기에서 나온 첫 번째 가지의 개수는 2개이며, 두 번째 가지의 총 개수는 첫 번째 가지의 수에 2를 곱해 4개이다.
  2. N번째 나뭇가지의 길이는 N-1번째 나뭇가지의 길이의 R/100배이고, 소수점 이하는 버린다. 0번째 나뭇가지는 중심줄기이다.
  3. 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을 나눴다.