티스토리 뷰
Solved.ac Class 완전정복 프로젝트
Class : 2 ~ 2 ++
링크
https://www.acmicpc.net/problem/11726
문제
2 ×n 1×2, 2 ×1타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오.
아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.
입력
첫째 줄에 n이 주어진다. (1 ≤ n ≤ 1,000)
출력
첫째 줄에 2×n 크기의 직사각형을 채우는 방법의 수를 10,007로 나눈 나머지를 출력한다.
접근방법
N의 개수가 늘어날수록, 만들 수 있는 조합의 수가 증가한다. 그러나 n이 2칸 증가할 때와 1칸 증가할 때, 만들 수 있는 경우의 수가 달라진다. 그렇기에 어떤 규칙성을 만들 수 있을까부터 생각해야 한다. 규칙성이 잘 보이지 않아, 그려가며 접근했고, 이전 값들을 활용해서 현재 값을 확인할 수 있는 방법을 찾아냈다. 즉, DP(Dynamic Programming) 문제이다.
풀이
N = 1 일 때는 세로 한칸의 방식밖에 사용할 수 없다. 그러나 N= 2가 되면 세로로 두 칸 가로로 두 칸으로 방법의 가짓수가 2개가 된다.
그런데 N = 3일때 부터 보자. 2 x 3에서 블록을 둘 때, 뒤에서 부터 생각하면 모든 경우의 수는 두 가지로 나뉘게 된다.
- 마지막 블록이 세로 블록이다.
- 마지막 블록이 가로 블록이다.
1번의 경우, 이전값에서 블록 하나만 맨뒤에 붙인 것으므로, N= k 일 때 k-1 값만 더 해주면 된다.
2번의 경우, 칸을 2블록을 차지한다. 때문에 N= k 일 때, k-2 값을 더 해줘야 한다.
위의 경우를 N =3 일 때에 대입하여, 그림으로 표현해보았다.
결국 뒤쪽 블록이 어떤 형태이냐만 나누어준다면, 이전 값을 활용하여, 새로운 값을 도출해 나갈 수 있다.
즉, DP [N]을 2 x N에서 블록을 놓을 수 있는 경우의 수라 가정했을 때, 다음과 같이 표현할 수 있다.
DP [k] = DP [k-1]+DP [k-2]
위의 원리를 이용하여, 코드에 대입하면 다음과 같다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
Main tset =new Main();
}
int[] dp = new int[1001];
public Main() throws IOException {
BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
int num = Integer.parseInt(br.readLine());
System.out.println(solution(num));
}
int solution(int num){
dp[1] = 1;
dp[2] = 2;
for (int i = 3 ; i <dp.length;i++){
dp[i] = (dp[i-1]+dp[i-2])%10007;
}
return dp[num];
}
}
결과
포스팅에 문제가 있거나, 설명이 잘못된 부분 지적 환영합니다.
더 나은 퀄리티의 콘텐츠를 제공할 수 있도록 노력하겠습니다.
읽어주셔서 감사합니다.
'공부 > 코딩 테스트 준비' 카테고리의 다른 글
[백준] 7576 - 토마토 JAVA (0) | 2021.09.15 |
---|---|
[백준] 1389 - 케빈 베이컨의 6단계 법칙 JAVA (0) | 2021.09.13 |
[백준] 10866 - 덱 JAVA (0) | 2021.09.11 |
[백준] 1003 -피보나치 함수 JAVA (0) | 2021.09.10 |
[백준] 2108 - 통계학 JAVA (0) | 2021.09.09 |
- Total
- Today
- Yesterday
- 브루트포스
- 실패일기
- looker core
- Spring
- 백준
- 코딩테스트
- JNDI연동
- looker instance 접속
- 파이썬
- DFS
- java
- 프로그래머스
- 카카오
- 유클리드-호제법
- Python
- 하루 회고
- BFS
- value annotation
- 재귀
- 아기상어나쁜상어
- 그래프 탐색
- 아기상어미워
- 프로그래머스 문제정복
- dml
- 9019
- DP
- db
- 플루이드 와샬
- 자바
- Database
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |