#2302 극장 좌석 문제는 수학적인 원리를 이해하면 풀기 편합니다.
문제의 링크입니다.
https://www.acmicpc.net/problem/2302
2302번: 극장 좌석
주어진 조건을 만족하면서 사람들이 좌석에 앉을 수 있는 방법의 가짓수를 출력한다. 방법의 가짓수는 2,000,000,000을 넘지 않는다. (2,000,000,000 < 231-1)
www.acmicpc.net
극장 좌석은 일렬로 최대 40개까지 있을 수 있습니다. 이 중 몇개의 좌석은 이미 고정석으로 채워져 있을 때, 1부터 N까지의 숫자를 채우는 경우의 수를 구하는 문제입니다. 단, 모든 숫자는 자신의 자리 번호와 그 옆자리로 이동을 할 수 있지만, 고정석으로는 이동할 수 없습니다.

극장 자리는 아래와 같이 표시될 수 있습니다. 고정석을 ඛ이라고 표현하면, 다음과 같이 표현할 수 있습니다.
ඛ | ඛ |
고정석을 건너띄어서 앉을 수 없기 때문에 위와 같은 경우에는 4개의 칸에서 나오는 경우의 수와, 3개의 칸에서 나오는 경우의 수와 1개의 칸에서 나오는 경우의 수를 계산하면 됩니다.
1개의 칸의 경우의 수가 1인 것은 당연합니다.
2개의 칸인 경우에는 2, 3개의 칸인 경우에는 3, 4개의 칸인 경우에는 5...
가 되어서 사실 피보나치 수열이 됩니다.
이렇게 해서 좌석의 경우의 수를 모두 곱하면 됩니다.
제가 작성한 소스입니다.
//------------------------------------------------
// baekjoon #2302
// - by Aubrey Choi
// - created at 2019-06-28
//------------------------------------------------
#include <stdio.h>
int main()
{
int p = 1, c = 1, n, m, t;
int f[] = { 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,
233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711,
28657, 46368, 75025, 121393, 196418, 317811, 514229,
832040, 1346269, 2178309, 3524578, 5702887, 9227465,
14930352, 24157817, 39088169, 63245986, 102334155, 165580141 };
scanf("%d", &n);
scanf("%d", &m);
while(m--)
{
scanf("%d", &t);
c *= f[t-p]; p = t+1;
}
c *= f[n-p+1];
printf("%d\n", c);
}
반응형
'Programming > BOJ' 카테고리의 다른 글
[C/C++] 백준 #2316 도시 왕복하기 2(포드-폴커슨 알고리즘) (0) | 2023.04.25 |
---|---|
[C/C++] 백준 #2312 수 복원하기(수학) (0) | 2023.04.20 |
[C/C++] 백준 #2294 동전 2(동적 계획법) (0) | 2023.04.20 |
[C/C++] 백준 #2293 동전 1(동적 계획법) (0) | 2023.04.20 |
[C/C++] 백준 #2290 LCD Test(구현) (0) | 2023.04.20 |
댓글