코딩테스트/Baekjoon

[백준 #2502] 떡 먹는 호랑이 (C++)

동띵 2021. 9. 18. 16:15

https://www.acmicpc.net/problem/2502

 

2502번: 떡 먹는 호랑이

첫줄에 첫 날에 준 떡의 개수 A를 출력하고 그 다음 둘째 줄에는 둘째 날에 준 떡의 개수 B를 출력한다. 이 문제에서 주어진 D, K에 대해서는 항상 정수 A, B (1≤A≤B)가 존재한다. 

www.acmicpc.net

 

첫날의 준 떡의 개수는 A, 둘째 날에 준 떡의 개수는 B이므로

셋째 날에는 A+B, 넷째 날에는 A+2B 식으로 늘어난다.

 

A와 B의 계수를 담을 배열을 각각 만든 후

a[1] = 1, a[2] = 0

b[1] = 0, b[2] = 1 값을 미리 준다.

 

그다음부터는 피보나치의 수열처럼 계산하면 되므로

for 문을 사용해 값을 얻을 수 있다.

 

그다음 새로운 for 문을 통해

첫째 날 주는 떡의 개수를 1부터 k까지 늘려가면서

이를 계산하고 남은 떡의 양과 B의 계수가 나누어떨어진다면

첫째 날 주는 떡의 개수와 둘째 날 주는 떡의 개수를 출력하였다.

 

#include <iostream>
using namespace std;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	int d, k;
	int a[31], b[31];

	cin >> d >> k;

	a[1] = 1;
	a[2] = 0;
	b[1] = 0;
	b[2] = 1;

	for (int i = 3; i <= d; i++) {
		a[i] = a[i - 1] + a[i - 2];
		b[i] = b[i - 1] + b[i - 2];
	}

	for (int i = 1; i <= k; i++) {
		int tmp = k - (a[d] * i);
		if (tmp % b[d] == 0) {
			cout << i << "\n" << tmp / b[d];
			break;
		}
	}
	return 0;
	
}