백준 1309번 (C++)

2021. 8. 7. 20:23Algorithm/알고리즘 스터디(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. 알고리즘

  •  사자가 이웃하지 않게 우리에 넣는 경우는 다음과 같이 세 가지가 있다.

사자를 조건에 맞게 우리에 넣는 경우

  1. 왼쪽에 사자가 들어가는 경우 : 그다음 줄에 오른쪽에 사자가 들어가거나 들어가지 않으면 된다.
  2. 오른쪽에 사자가 들어가는 경우 : 그다음 줄에 왼쪽에 사자가 들어가거나 들어가지 않으면 된다.
  3. 사자가 들어가지 않는 경우 : 사자가 어디든 들어가도 되며, 아예 들어가지 않아도 된다.
  • 2차원 배열을 만들고, array[i][0]을 첫 번째 경우, array[i][1]을 두 번째 경우, array[i][2]를 세 번째 경우라고 생각하면 된다.
  1. array[1][0] = 1, array[1][1] = 1, array[1][2] = 2
  2. array[i][0] = array[i-1][1] + array[i-1][2]
  3. array[i][1] = array[i-1][0] + array[i-1][2]
  4. 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