본문 바로가기

알고리즘(백준 등) 공부/백준(자바)

백준 1309번: 동물원

https://www.acmicpc.net/problem/1309

 

2개의 열과 N개의 행으로 이루어진 공간에 가로, 세로로 붙어있지 않게 사자를 배치하는 모든 경우의 수를 구하는 문제이다.

dp로 경우의 수를 누적하며, N개의 열과 그 열의 상태에 해당하는 00, 10, 01을 열로 두어 상태 별 경우의 수를 누적한다.

 

dp[i][0] 는 1열, 2열 모두 배치하지 않으므로, 이전 행의 모든 경우의 수를 더한 값이다.. dp[i][1]은 왼쪽에 배치하므로 이전 행의 아무것도 배치하지 않거나 오른쪽에만 배치한 경우에만 가능하므로 이 둘의 경우의 수를 더한 값이다. dp[i][2]는 오른쪽에 배치하므로 이전 행의 아무것도 배치하지 않거나 왼쪽에만 배치한 경우의 수를 더한 값이다.

for (int i = 1; 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;
}

 

 

결과 코드는 다음과 같다.

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class 동물원1309 {
    
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        br.close();
        long[][] dp = new long[n][3];
        dp[0][0] = 1;
        dp[0][1] = 1;
        dp[0][2] = 1;
        for (int i = 1; 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;
        }
        System.out.print((dp[n - 1][0] + dp[n - 1][1] + dp[n - 1][2]) % 9901);
    }
}

'알고리즘(백준 등) 공부 > 백준(자바)' 카테고리의 다른 글

백준 1312번: 소수  (0) 2026.03.13
백준 1311번: 할 일 정하기 1  (0) 2026.03.12
백준 1308번: D-Day  (0) 2026.03.08
백준 1304번: 지역  (0) 2026.03.07
백준 1302번: 베스트셀러  (0) 2026.03.06