백준 1309번 (C++)
2021. 8. 7. 20:23ㆍAlgorithm/알고리즘 스터디(2021)
반응형
https://www.acmicpc.net/problem/1309
1309번: 동물원
첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다.
www.acmicpc.net
1. 문제
어떤 동물원에 가로로 두칸 세로로 N칸인 왼쪽과 같은 우리가 있다.
이 동물원에는 사자들이 살고 있는데 사자들을 우리에 가둘 때, 가로로도 세로로도 붙어 있게 배치할 수는 없다. 이 동물원 조련사는 사자들의 배치 문제 때문에 골머리를 앓고 있다.
동물원 조련사의 머리가 아프지 않도록 우리가 2*N 배열에 사자를 배치하는 경우의 수가 몇 가지인지를 알아내는 프로그램을 작성해 주도록 하자. 사자를 한 마리도 배치하지 않는 경우도 하나의 경우의 수로 친다고 가정한다.
2. 입력 / 출력
가. 입력
첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다.
나. 출력
첫째 줄에 사자를 배치하는 경우의 수를 9901로 나눈 나머지를 출력하여라.
3. 알고리즘
- 사자가 이웃하지 않게 우리에 넣는 경우는 다음과 같이 세 가지가 있다.
- 왼쪽에 사자가 들어가는 경우 : 그다음 줄에 오른쪽에 사자가 들어가거나 들어가지 않으면 된다.
- 오른쪽에 사자가 들어가는 경우 : 그다음 줄에 왼쪽에 사자가 들어가거나 들어가지 않으면 된다.
- 사자가 들어가지 않는 경우 : 사자가 어디든 들어가도 되며, 아예 들어가지 않아도 된다.
- 2차원 배열을 만들고, array[i][0]을 첫 번째 경우, array[i][1]을 두 번째 경우, array[i][2]를 세 번째 경우라고 생각하면 된다.
- array[1][0] = 1, array[1][1] = 1, array[1][2] = 2
- array[i][0] = array[i-1][1] + array[i-1][2]
- array[i][1] = array[i-1][0] + array[i-1][2]
- array[i][2] = array[i-1][0] + array[i-1][1] + array[i-1][2]
4. 전체 코드
#include <stdio.h>
int i, N, result;
int array[100000][3];
int main() {
scanf_s("%d", &N);
array[1][0] = 1;
array[1][1] = 1;
array[1][2] = 1;
for (i = 2; i <= N; i++) {
array[i][0] = (array[i - 1][1] + array[i - 1][2]) % 9901;
array[i][1] = (array[i - 1][0] + array[i - 1][2]) % 9901;
array[i][2] = (array[i - 1][0] + array[i - 1][1] + array[i - 1][2]) % 9901;
}
result = (array[N][0] + array[N][1] + array[N][2]) % 9901;
printf("%d\n", result);
}
5. 코드 세부 설명
조건에 따라 9901로 나눈 나머지를 구한다는 것 외에는 위에 설명한 것에 덧붙일 내용이 없다.
반응형
'Algorithm > 알고리즘 스터디(2021)' 카테고리의 다른 글
백준 9251번 (C++) (0) | 2021.08.14 |
---|---|
백준 16953번 (C++) (0) | 2021.08.06 |
백준 10164번 (C++) (0) | 2021.08.06 |
백준 2780번 (C++) (0) | 2021.07.30 |
백준 1946번 (C++) (0) | 2021.07.29 |