CodingTest/백준

[백준] 동적 계획법 (1904 : 01타일)

브디크리 2023. 9. 24. 14:18

문제


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

 

1904번: 01타일

지원이에게 2진 수열을 가르쳐 주기 위해, 지원이 아버지는 그에게 타일들을 선물해주셨다. 그리고 이 각각의 타일들은 0 또는 1이 쓰여 있는 낱장의 타일들이다. 어느 날 짓궂은 동주가 지원이

www.acmicpc.net


해설


import java.io.*;
import java.util.StringTokenizer;

public class Main {
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static StringBuilder sb = new StringBuilder();

    static int arr[];

    public static void main(String[] args) throws IOException {
        int N = Integer.parseInt(br.readLine());

        arr = new int[1000001];
        arr[1] = 1;
        arr[2] = 2;
        arr[3] = 3;

        sb.append(dp1904(N));
        bw.write(sb.toString());
        bw.flush();
        bw.close();
    }

    private static int dp1904(int N){
        if(arr[N] == 0)
            arr[N] = (dp1904(N-1)+dp1904(N-2)) % 15746;
        return arr[N];
    }
}
N 1 2 3 4 5 6 7 8
1 (1) 1              
2 (2) 11 00            
3 (3) 111 100 001          
4 (5) 1111 1100 1001 0011 0000      
5 (8) 11111 11100 11001 10011 00111 00001 00100 10000

해당 표를 확인해보면 규칙을 발견할 수 있다.

N = 1 → 1

N = 2 → 2

N = 3 → 3

N = 4 → 5 (2 + 3)

N = 5 → 8 (3 + 5)

∴ arr[N] = arr[N-1] + arr[N-2] 이다.

따라서 이를 재귀함수로 구현하고, 이미 계산했던 값일 경우, 결과를 그대로 사용하도록 한다.


결론


어떻게 풀지 생각하다가, 각 경우를 확인해보았는데, 규칙성을 찾을 수 있어서 쉽게 해결할 수 있었따!.