Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 스프링이미지업로드
- 파이썬sort
- 스프링구독
- 출처 따배도
- 출처 메타코딩
- 출처 코딩셰프
- 스프링부트팔로우취소
- 출처 문어박사
- 스프링부트api
- 스프링익셉션처리
- 출처 노마드코더
- 스프링부트구독취소
- ssh도커설치
- 도커설치하는법
- 서버에도커설치
- 멀티폼
- 스프링부트중복예외처리
- centos도커설치
- 스프링사진업로드
- WAS웹서버
- 인스타클론
- springboot_exception_handler
- 스프링부트서버에사진전송
- 스프링부트
- 스프링부트팔로잉
- vm도커설치하는법
- 스프링사진
- dockerinstall
- 우분투도커설치
- 스프링부트사진올리기
Archives
- Today
- Total
MakerHyeon
[백준] 11726번 2 X n 타일링 (python,c++) 본문
https://www.acmicpc.net/problem/11726
11726번: 2×n 타일링
2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.
www.acmicpc.net
n개의 숫자로 순열을 만든다했을때,하나의 숫자의 자리가 정해졌다면 나머지 숫자들로 만들 수 있는 경우의 수는 (n-1)!이다.
해당 문제는 이러한 원리와 dp를 이용한다. 먼저 n이 1일때,2일때...를 차례로 그려보며 규칙을 찾는다.
끝블록은 두 블록중 하나인것을 알 수 있다.
이렇게 한 자리가 정해져 있다면, 경우의 수가(n-1)! 과 같은 순열과 같이, 끝 블록이 정해져있을때 경우의수는 이전배열 dp[n-1] 경우의 수와 같다.
2 x N 크기의 직사각형을 채울 수 있는 방법의 수 = 2 x (N - 2) 크기의 직사각형을 채울 수 있는 방법의 수 + 2 x (N - 1)크기의 직사각형을 채울 수 있는 방법의 수
(%100007조건은 숫자가 너무 커지는 경우에 답을 간단하게 도출하기 위한 것이니 크게 신경쓸 필요 없다.)
SOLUTION CODE
# PYTHON
- Bottom up 방식. 시간복잡도 O(N)
1) 반복문 풀이
MOD = 10_007
dp = [0] * 1001
dp[1] = 1
dp[2] = 2
n = int(input())
for i in range(3,1001):
dp[i] = (dp[i - 1] + dp[i - 2]) % MOD
print(dp[n])
2) 재귀 풀이
import sys
sys.setrecursionlimit(10000000)
def calc(n):
if n==1: return 1
if n==2: return 2
if dp[n]==0:
dp[n] = calc(n-2) + calc(n-1)
return dp[n]
n = int(input())
dp = [0]* (n+1)
print(calc(n)%10007)
# C++
1) 반복문 풀이
#include <stdio.h>
int dp[1005] = {1,1};
int main(){
int n;
scanf("%d",&n);
for(int i=2;i<=n;i++){
dp[i] = (dp[i-1]+dp[i-2])%10007;
}
printf("%d\n",dp[n]);
return 0;
}
2) 재귀 풀이
#include <iostream>
using namespace std;
int dp[1001];
int func(int x){
if(x==1) return dp[x]=1;
if(x==2) return dp[x]=2;
if(dp[x]!=0) return dp[x];
return dp[x] = (func(x-1)+func(x-2))%10007;
}
int main(){
int n;
cin >> n;
cout << func(n);
return 0;
}
'Algorithm > backjoon' 카테고리의 다른 글
[백준] 1018번 체스판 다시 칠하기 (python,c++) (2) | 2023.03.02 |
---|---|
[백준] 10844번 쉬운 계단 수 (python,c++) (0) | 2023.03.01 |
[백준] 11051번 이항 계수 2 (python,c++) (0) | 2023.02.23 |
[백준] 2748번 피보나치 수 2 (python,c++) (0) | 2023.02.23 |
[백준] 10815번 숫자 카드 (python,c++) (0) | 2023.02.17 |
Comments