https://www.acmicpc.net/problem/2502
2502번: 떡 먹는 호랑이
첫줄에 첫 날에 준 떡의 개수 A를 출력하고 그 다음 둘째 줄에는 둘째 날에 준 떡의 개수 B를 출력한다. 이 문제에서 주어진 D, K에 대해서는 항상 정수 A, B (1≤ A ≤ B)가 존재한다.
www.acmicpc.net
사실 골드 문제를 풀다가 현타가 와서 실버 문제를 찾게 되었다... 열심히 해야겠다.
접근
호랑이에게 떡을 주는 방법은 어제 준 떡 갯수 + 그저께 준 떡 갯수이다.
피보나치와 똑같은데 문제는 첫 날과 둘째 날에 떡을 몇 개 줬는지 모르고, D번째 날에 K개 만큼 줬다고 한다.
어떤 공식으로 한 번에 풀리지 않을 것 같아 예시를 써보기로 했다.
첫 날에 준 떡 갯수를 , 둘째 날에 준 떡 갯수를 라고 하자.
1일: a
2일: b
3일: (a)+(b)
4일: (a+b)+(b)
5일: (a+b+b)+(a+b)
6일: (a+b+b+a+b)+(a+b+b)
...
5일에 준 떡 갯수를 세어보면 이다.
6일에 준 떡 갯수를 세어보면 이다.
잘 보면 계수가 피보나치이다!
피보나치의 n번째 값을 f(n)이라고 할 때, K번째 날에 준 떡 갯수는 이다.
이 문제가 dp인 이유는 피보나치를 활용했기 때문이고, 와 의 값을 구하기 위해선 일일이 대입해봐야 한다.
문제에서 항상 답이 존재한다 했으므로 무한 반복 돌려서 찾아내면 된다. 못해도 1부터 K사이에 있으니까 괜찮다.
미흡했던 점
기하학문제를 풀다가 DP로 넘어오니 뇌가 초기화된 느낌이다. 더 풀어야 한다.
#include <iostream>
int dp[30]{0, 1}, A = 0, B = 0;
int main() {
int D, K;
for (int i = 2; i < 30; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
scanf("%d %d", &D, &K);
for (int i = 1;; i++) {
if ((K - dp[D - 2] * i) % dp[D - 1] == 0) {
A = i;
B = (K - dp[D - 2] * i) / dp[D - 1];
break;
}
}
printf("%d\n%d", A, B);
}
'프로그래밍 > 알고리즘' 카테고리의 다른 글
1059 좋은 구간 (0) | 2022.09.18 |
---|---|
9465 스티커 (0) | 2022.09.10 |
1876 튕기는 볼링공 (0) | 2022.09.06 |
4105 유클리드 (0) | 2022.09.05 |
2527 직사각형 (0) | 2022.09.03 |
댓글