μ•Œκ³ λ¦¬μ¦˜

[Java] BOJ 11727 2×n 타일링 2

🍊귀🍊 2024. 7. 30. 23:03

문제 

문제 링크 https://www.acmicpc.net/problem/11727

  • 2×n μ§μ‚¬κ°ν˜•μ„ 1×2, 2×1κ³Ό 2×2 νƒ€μΌλ‘œ μ±„μš°λŠ” λ°©λ²•μ˜ 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.
  • μ•„λž˜ 그림은 2×17 μ§μ‚¬κ°ν˜•μ„ μ±„μš΄ ν•œκ°€μ§€ μ˜ˆμ΄λ‹€.
  • 첫째 쀄에 n이 μ£Όμ–΄μ§„λ‹€. (1 ≤ n ≤ 1,000)
  • 첫째 쀄에 2×n 크기의 μ§μ‚¬κ°ν˜•μ„ μ±„μš°λŠ” λ°©λ²•μ˜ 수λ₯Ό 10,007둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό 좜λ ₯ν•œλ‹€.

아이디어

  • μ§μ‚¬κ°ν˜•μ„ μ±„μš°λŠ” λ°©λ²•μ˜ 수λ₯Ό μ €μž₯ν•  n + 1 크기의 배열을 μƒμ„±ν•œλ‹€.
  • μ§μ‚¬κ°ν˜•μ˜ κ°€λ‘œκ°€ 1μΌλ•Œ λ°©λ²•μ˜ μˆ˜λŠ” 1, κ°€λ‘œκ°€ 2μΌλ•Œ λ°©λ²•μ˜ μˆ˜λŠ” 3이기 λ•Œλ¬Έμ— λ°°μ—΄μ˜ 첫번째 값은 1, λ‘λ²ˆμ§Έ 값은 3으둜 μ΄ˆκΈ°ν™”ν•œλ‹€.
  • 3λΆ€ν„° nκΉŒμ§€ λ°˜λ³΅μ„ ν•˜λŠ”λ°, κ°€λ‘œκ°€ i인 μ§μ‚¬κ°ν˜•μ„ μ±„μšΈ λ°©λ²•μ˜ μˆ˜λŠ” κ°€λ‘œκ°€ i - 1인 μ§μ‚¬κ°ν˜•μ„ μ±„μš°λŠ” λ°©λ²•μ˜ μˆ˜μ™€ κ°€λ‘œκ°€ i - 2인 μ§μ‚¬κ°ν˜•μ„ μ±„μš°λŠ” λ°©λ²•μ˜ 수λ₯Ό 2λ°°ν•œ 값을 λ”ν•œ κ°’κ³Ό κ°™μœΌλ―€λ‘œ ν•΄λ‹Ή 두 값을 λ”ν•˜κ³  10007을 λ‚˜λˆ  λ‚˜λ¨Έμ§€ 값을 λ°°μ—΄μ˜ iλ²ˆμ§Έμ— μ €μž₯ν•œλ‹€.

κ²ͺ은 μ‹œν–‰μ°©μ˜€

  • X

2×n νƒ€μΌλ§μ΄λž‘ λ¬Έμ œκ°€ 거의 λΉ„μŠ·ν•΄μ„œ μ‰½κ²Œ ν’€μ—ˆλ‹€..!

μ½”λ“œ

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

public class BOJ11727 {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // μ§μ‚¬κ°ν˜• κ°€λ‘œ 길이
        int n = Integer.parseInt(br.readLine());

        // μ§μ‚¬κ°ν˜•μ„ μ±„μš°λŠ” λ°©λ²•μ˜ 수λ₯Ό μ €μž₯ν•  λ°°μ—΄
        int sqr[] = new int[n + 1];

        // μ§μ‚¬κ°ν˜•μ˜ κ°€λ‘œ 길이가 1일 λ•Œ, μ±„μš°λŠ” λ°©λ²•μ˜ κ°œμˆ˜κ°€ 1이고
        // κ°€λ‘œ 길이가 2일 λ•Œ, μ±„μš°λŠ” λ°©λ²•μ˜ κ°œμˆ˜κ°€ 3μ΄λ―€λ‘œ
        // λ°°μ—΄μ˜ 1번째 값을 1둜, 2번째 값을 3으둜 μ΄ˆκΈ°ν™”
        sqr[1] = 1;

        if(n > 1){
            sqr[2] = 3;
        }

        // 3λΆ€ν„° nκΉŒμ§€ 반볡
        for(int i = 3; i <= n; i++){
            // κ°€λ‘œκ°€ i인 μ§μ‚¬κ°ν˜•μ„ μ±„μš°λŠ” λ°©λ²•μ˜ μˆ˜λŠ”
            // κ°€λ‘œκ°€ i - 1인 μ§μ‚¬κ°ν˜•μ„ μ±„μš°λŠ” λ°©λ²•μ˜ μˆ˜μ™€
            // κ°€λ‘œκ°€ i - 2인 μ§μ‚¬κ°ν˜•μ„ μ±„μš°λŠ” λ°©λ²•μ˜ μˆ˜μ— 2λ₯Ό κ³±ν•œ 값을 λ”ν•œ κ°’κ³Ό
            // κ°™κΈ° λ•Œλ¬Έμ— 두 값을 더해쀀 λ’€ 10007둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€ 값을 ꡬ함
            sqr[i] = (sqr[i - 1] + 2*sqr[i - 2]) % 10007;
        }

        System.out.println(sqr[n]);
    }
}