세 개의 수 a, b, c가 입력으로 주어졌을 때, 다음과 같은 번식 규칙이 적용된다고 가정하고 n초 후 각각의 개수를 구하는 것이 이 문제의 목표입니다.
- 모든 a는 2초마다 b로 변합니다.
- 모든 b는 5초마다 c로 변합니다.
- 모든 c는 12초마다 2개의 a로 변합니다.
예제로 이해하기
입력 예시 1
n_seconds = 62, a = 1, b = 1, c = 1
출력
주어진 번식률에서 n초 후 a의 개수: 0
주어진 번식률에서 n초 후 b의 개수: 33
주어진 번식률에서 n초 후 c의 개수: 1
설명: 60초가 지나면 a = 32, b = 0, c = 0이 됩니다. 이후 2초가 더 지나면 모든 a는 b로 변해 b = 33이 되고, 마지막 c 하나는 아직 12초가 채워지지 않아 그대로 유지되므로 c = 1입니다.
입력 예시 2
n_seconds = 20, a = 1, b = 1, c = 1
출력
주어진 번식률에서 n초 후 a의 개수: 0
주어진 번식률에서 n초 후 b의 개수: 0
주어진 번식률에서 n초 후 c의 개수: 6
설명: 초 단위 변화 과정은 다음과 같습니다.
- 1초: a=1, b=1, c=1
- 2초: a=0, b=2(1+1), c=1 → a가 b로 변환
- 4초: a=0, b=2, c=1
- 5초: a=0, b=0, c=3(1+2) → b가 c로 변환
- 10초: a=0, b=0, c=3
- 12초: a=6(0+2×3), b=0, c=0 → c가 2개의 a로 변환
- 14초: a=0, b=6, c=0 → a가 b로 변환
- 15초: a=0, b=0, c=6 → b가 c로 변환
- 20초: a=0, b=0, c=6
접근 방법
변화 주기인 2, 5, 12의 최소공배수(LCM)는 60초입니다. 따라서 60초마다 a, b, c의 값은 다음과 같이 변합니다.
- 60초 후 → a = 32, b = 0, c = 0
- 120초 후 → a = 32 × 32, b = 0, c = 0
- 180초 후 → a = 32 × 32 × 32, b = 0, c = 0
즉, 입력받은 시간이 60의 배수라면 위 공식으로 a를 바로 계산할 수 있습니다. 60의 배수가 아니라면, 입력 시간 이하에서 가장 가까운 60의 배수를 구한 뒤 그다음 초부터 입력 시간까지 반복하면서 나머지 연산(mod 2, 5, 12)을 통해 값을 갱신하면 됩니다.
알고리즘 단계
- 수 a, b, c와 시간 n_seconds를 입력받습니다.
- reproduction_rate(int n_seconds, int a, int b, int c) 함수가 모든 매개변수를 받아 n초 후의 a, b, c 개수를 출력합니다.
- temp = n_seconds / 60으로 n_seconds 이하의 60의 배수 개수를 구합니다.
- 공식에 따라 a = (int)pow(32, temp)를 계산합니다.
- temp = 60 × temp로 갱신하여 n_seconds 이하의 가장 큰 60의 배수를 구합니다.
- for 반복문으로 i = temp + 1부터 i = n_seconds까지 순회합니다.
- i가 2의 배수이면 b에 a를 더하고 a를 0으로 만듭니다.
- i가 5의 배수이면 c에 b를 더하고 b를 0으로 만듭니다.
- i가 12의 배수이면 a에 2×c를 더하고 c를 0으로 만듭니다.
- 반복문이 끝나면 최종 a, b, c 값을 출력합니다.
C++ 구현 코드
#include <bits/stdc++.h>
using namespace std;
void reproduction_rate(int n_seconds, int a, int b, int c) {
int temp = n_seconds / 60;
a = (int) pow(32, temp);
temp = 60 * temp;
for (int i = temp + 1; i <= n_seconds; i++) {
if (i % 2 == 0) {
b = b + a;
a = 0;
}
if (i % 5 == 0) {
c = c + b;
b = 0;
}
if (i % 12 == 0) {
a = a + (2 * c);
c = 0;
}
}
cout << "Count of a after n seconds for given reproduction rate is: " << a << "\n";
cout << "Count of b after n seconds for given reproduction rate is: " << b << "\n";
cout << "Count of c after n seconds for given reproduction rate is: " << c;
}
int main() {
int n_seconds = 72;
int a = 2;
int b = 1;
int c = 1;
reproduction_rate(n_seconds, a, b, c);
return 0;
}위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
출력 결과
Count of a after n seconds for given reproduction rate is: 68 Count of b after n seconds for given reproduction rate is: 0 Count of c after n seconds for given reproduction rate is: 0