반응형
문제
2 ×n 직사각형을 1 × 2, 2 ×1과 2 × 2 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.
아래 그림은 2×17 직사각형을 채운 한 가지 예이다.
입력
첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)
출력
첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.
테스트 케이스
입력 1
501
출력 1
4172
입력 2
1
출력 2
1
입력 3
1000
출력 3
7326
접근
코드 자체는 간단하지만 dp문제이므로 규칙 찾는 게 핵심인 문제인 듯합니다.
1.2*n 식에 들어갈 n을 입력받습니다.
일단 n이 몇이든간에, 시작은 그림과 같이 3가지 경우로 블록은 쌓이면서 시작합니다.(n이 1일 때만 제외하고)
n이 1일때랑, 2일 때의 개수를 직접 세보았습니다.
f(3)부터는 규칙이보이게됩니다.
첫 사진에 설명한 것처럼 3가지 경우로 시작할 수밖에 없는데, 3가지 경우로 시작한 경우 남는 블록수만큼 f(n)을 지정하여 더해주면 됩니다.
따라서 f(n) = f(n-1) + 2*f(n-2)라는 점화식이 나오게 됩니다.
이를 이용하여 코드를 짜니 문제가 해결되었습니다.
코드
import java.awt.desktop.SystemEventListener;
import java.io.*;
import java.math.*;
import java.util.*;
public class Main {
/*
11727 problem
*/
public static void main(String[] args) throws NumberFormatException, IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int num = Integer.parseInt(br.readLine());
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(1);
for(int i=2; i<=num; i++) {
list.add((list.get(i-1) + 2*list.get(i-2))%10007);
}
bw.write(String.valueOf(list.get(num)));
bw.flush();
br.close();
bw.close();
}
}
주의
10007로 나눠서 출력해주는 것 주의.
반응형
'공부 정리 > 백준' 카테고리의 다른 글
[백준] 자바 1929 소수 구하기 (0) | 2021.09.23 |
---|---|
[백준] 자바 9461 파도반 수열 (0) | 2021.09.22 |
[백준] 자바 2164 카드2 (0) | 2021.09.20 |
[백준] 자바 8979 올림픽 (0) | 2021.09.17 |
[백준] 자바 1026 보물 (0) | 2021.09.16 |
댓글