백준 동물원

KIMYEONGJUN·3일 전
0
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫째 줄에 우리의 크기 N(1≤N≤100,000)이 주어진다.

첫째 줄에 사자를 배치하는 경우의 수를 9901로 나눈 나머지를 출력하여라.

내가 이 문제를 보고 생각해본 부분

BufferedReader를 사용하여 입력을 읽고, 첫 번째 줄에서 정수 N을 읽는다.
이는 우리(격자)의 세로 길이를 나타낸다.
DP 배열 초기화:
dp는 2차원 배열로, dp[i][j]는 i번째 열에서 사자 배치의 상태를 나타낸다.
dp[i][0]: i번째 열에 사자가 없는 경우의 수
dp[i][1]: i번째 열의 첫 번째 줄에 사자가 있는 경우의 수
dp[i][2]: i번째 열의 두 번째 줄에 사자가 있는 경우의 수
초기값 설정:
dp[0][0]은 사자가 없는 경우로 초기값을 1로 설정해준다.
나머지 두 가지 경우는 0으로 설정한다. (0번째 열에는 사자가 있을 수 없음)
동적 프로그래밍 계산:
이 루프는 1부터 N까지 각 열에 대해 가능한 경우의 수를 계산합니다.
사자가 없는 경우 (dp[i][0]):
이전 열의 모든 경우를 더한다.
사자가 첫 번째 줄에 있는 경우 (dp[i][1]):
이전 열에서 사자가 없는 경우와 두 번째 줄에 사자가 없는 경우만 더한다. (사자가 가로로 붙어 있지 않도록 하기 위함)
사자가 두 번째 줄에 있는 경우 (dp[i][2]):
이전 열에서 사자가 없는 경우와 첫 번째 줄에 사자가 있는 경우를 더한다.
결과 계산 및 출력:
마지막 열(N번째 열)의 모든 경우를 더하여 결과를 계산하고, 9901로 나눈 나머지를 출력해준다.

코드로 구현

package baekjoon.baekjoon_25;

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

// 백준 1309번 문제
public class Main872 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());

        // dp 배열 초기화 (N+1 x 3 크기의 2차원 배열)
        long[][] dp = new long[N + 1][3];

        // 초기값 설정
        dp[0][0] = 1;  // 사자가 없는 경우
        dp[0][1] = 0;  // 사자가 있는 경우 (불가능)
        dp[0][2] = 0;  // 사자가 있는 경우 (불가능)

        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;
        }

        // 결과 계산
        long result = (dp[N][0] + dp[N][1] + dp[N][2]) % 9901;
        System.out.println(result);
        br.close();
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글