일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 해시를사용한집합과맵
- 구현
- 그리디
- 프로그래머스코딩테스트
- 사칙연산
- C언어
- C
- 논문구현
- SQL
- 프로그래머스sql
- 브루트포스알고리즘
- 다이나믹프로그래밍
- 이분탐색
- 이진탐색
- 백준
- 수학
- 논문리뷰
- 소수판정
- 그리디알고리즘
- 큐
- 백준알고리즘
- 프로그래머스연습문제
- 자료구조
- C++
- 프로그래머스
- MySQL
- Image Classification
- 문자열
- 정렬
- 정수론
- Today
- Total
초보 개발자의 이야기, 릿허브
[C++] 백준 11726번 2×n 타일링 본문
1. 문제이해
주어진 n에 대해 2×n 크기의 직사각형을
1×2, 2×1 타일로 채우는 방법의 수를 구하는 것이 목표이다.
단, 방법의 수를 10,007로 나눈 값을 출력해야 한다.
2. 문제풀이
2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 문제이다.
아래 그림을 통해 n이 1일때부터 하나씩 증가해가며 타일을 채우는 방법을 알아보자.
위 그림을 통해,
n번째 타일을 채우는 경우의 수 = (n - 1)번째 경우의 수 + (n - 2)번째 경우의 수
임을 확인할 수 있다.
이렇듯, 도출해낸 풀이방법을 통해 구현한 코드는 아래와 같았다.
3. 소스코드
#include <iostream>
using namespace std;
int main() {
int n;
int Rectangle[1000];
cin >> n;
Rectangle[0] = 0;
Rectangle[1] = 1;
Rectangle[2] = 2;
// n번째 타일을 채우는 경우의 수
// = (n - 1)번째 경우의 수 + (n - 2)번째 경우의 수
for (int i = 3; i <= n; i++) {
Rectangle[i] = (Rectangle[i - 1] + Rectangle[i - 2]) % 10007;
}
cout << Rectangle[n];
return 0;
}
배열 Rectangle을 선언하고, n을 입력받는다.
Rectangle[i]는 2×i 번째 직사각형을 1×2, 2×1 타일로 채우는 방법의 수이다.
Rectangle[0], Rectangle[1], Rectangle[2] 값을 미리 선언해 준 뒤,
2. 문제풀이에서 구한
n번째 타일을 채우는 경우의 수 = (n - 1)번째 경우의 수 + (n - 2)번째 경우의 수를 적용해준다.
( Rectangle[i] = (Rectangle[i - 1] + Rectangle[i - 2]) % 10007; )
문제에서 해당 값을 10007로 나눈 나머지를 출력하라고 했으므로, %10007을 해주었다.
막상 그림을 그려 풀어보니, 다이나믹 프로그래밍 문제였다.
언제풀어도 DP문제는 헷갈리는 것 같다.. 식 도출해내는 과정도 비교적 어려운것 같기도 하고..🤔
설명은 글로만 설명하면 역시 눈에 안들어올 것 같아서 급하게 삼성노트에 적어보았는데,
아이패드의 필요성을 또 한번 절실하게 느꼈다..🤣
조만간 아이패드를 하나 장만해야지... 꼭...😭😭
'코딩테스트 > 📗 백준 (BOJ)' 카테고리의 다른 글
[C++] 백준 2822번 점수 계산 (0) | 2021.11.08 |
---|---|
[C++] 백준 1094번 막대기 (0) | 2021.11.01 |
[C++] 백준 1037번 약수 (0) | 2021.10.28 |
[C++] 백준 13699번 점화식 (0) | 2021.10.15 |
[C++] 백준 9656번 돌 게임 2 (1) | 2021.10.12 |