문제 설명
1. 사자는 상하좌우로 겹칠 수 없다.
2. 없는 경우의 수도 카운트를 센다.
풀이
1. dp 를 이용해 풀었다.
2. i 번째 칸에 사자가 없는 경우
3. i 번째 칸에 사자가 왼쪽에 있는 경우
4. i 번째 칸에 사자가 오른쪽에 있는 경우
5. 위의 3 가지를 이용해서 풀었다.
증명
1. 1 번째 에서는 경우의 수가 3가지다.(항상)
2. i (i >= 2) 번째 에는 i - 1 번 째에 저장된 값을 이용해서 구할 수 있다. 예를 들어 [i][0] 을 구한다 하면 이전거에서 다 가능하기 때문에 [i-1][0~2] 를 다 더해줄 수 있다. 이런 방법을 사용하면
3. i 를 증가시키면서 답을 구할 수 있다.
코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.*; | |
import java.io.*; | |
/** | |
* https://www.acmicpc.net/problem/1309 | |
* BOJ 백준온라인져지 1309 동물원 풀이 | |
*/ | |
public class Main { | |
private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); | |
public static void main(String args[]) throws IOException { | |
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); | |
int N = Integer.parseInt(br.readLine()); | |
int dp[][] = new int[N + 1][3]; | |
dp[1][0] = dp[1][1] = dp[1][2] = 1; | |
for (int i = 2; i <= N; i++) { | |
dp[i][0] = (dp[i - 1][0] + dp[i - 1][1] + dp[i - 1][2]) % 9901; | |
dp[i][1] = (dp[i - 1][0] + dp[i - 1][2]) % 9901; | |
dp[i][2] = (dp[i - 1][0] + dp[i - 1][1]) % 9901; | |
} | |
bw.write(String.valueOf((dp[N][0] + dp[N][1] + dp[N][2]) % 9901)); | |
bw.flush(); | |
} | |
} |
문제
어떤 동물원에 가로로 두칸 세로로 N칸인 아래와 같은 우리가 있다.
이 동물원에는 사자들이 살고 있는데 사자들을 우리에 가둘 때, 가로로도 세로로도 붙어 있게 배치할 수는 없다. 이 동물원 조련사는 사자들의 배치 문제 때문에 골머리를 앓고 있다.
동물원 조련사의 머리가 아프지 않도록 우리가 2*N 배열에 사자를 배치하는 경우의 수가 몇 가지인지를 알아내는 프로그램을 작성해 주도록 하자. 사자를 한 마리도 배치하지 않는 경우도 하나의 경우의 수로 친다고 가정한다.
입력
첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다.
출력
첫째 줄에 사자를 배치하는 경우의 수를 9901로 나눈 나머지를 출력하여라.
예제 입력 1
4
예제 출력 1
41
'IT > 알고리즘' 카테고리의 다른 글
BOJ 백준온라인져지 14888 연산자 끼워넣기 풀이 (0) | 2018.06.16 |
---|---|
BOJ 백준온라인져지 2805 나무 자르기 풀이 (0) | 2018.06.16 |
BOJ 백준온라인져지 2003 수들의 합 2 풀이 (0) | 2018.06.15 |
BOJ 백준온라인져지 2133 타일 채우기 풀이 (0) | 2018.06.14 |
BOJ 백준온라인져지 2902 KMP는 왜 KMP일까? 풀이 (0) | 2018.06.14 |