🧩 백준 11726번: 2×n 타일링 문제 해설
2×n 타일링 문제는 동적 프로그래밍(DP) 패러다임을 활용하여 해결하는 대표적인 알고리즘 문제이다. 이 문제는 간단한 형태의 타일 채우기 문제이지만, 점화식을 도출하는 과정과 효율적인 구현 방법을 배울 수 있는 중요한 기초 문제이다.
1. 📝 문제 분석과 이해
1.1. 문제 설명
- 2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 문제이다2.
- 입력으로 n이 주어질 때(1 ≤ n ≤ 1,000), 채우는 방법의 수를 _10,007로 나눈 나머지_를 출력해야 한다2.
1.2. 문제 예시 이해
- n=1일 때: 세로로 타일 1개를 놓는 방법 1가지만 가능하다34.
- n=2일 때: 세로 타일 2개 또는 가로 타일 2개를 놓는 방법 총 2가지가 가능하다34.
- n=3일 때: 총 3가지 방법(세로 타일 3개, 세로 타일 1개+가로 타일 1개, 가로 타일 1개+세로 타일 1개)이 가능하다34.
1.3. 핵심 관찰사항
- 타일을 채우는 과정에서 엇갈려 놓기는 불가능하다10.
- 2×n 직사각형을 채우는 방법은 마지막에 세로 타일 하나를 놓는 경우와 마지막에 가로 타일 두 개를 놓는 경우로 나눌 수 있다1017.
2. 🧮 동적 프로그래밍 접근 방식
2.1. 상태 정의
- dp[n] = 2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수15.
2.2. 점화식 도출
- 마지막에 세로 타일 하나를 놓는 경우: 앞부분은 2×(n-1) 크기의 직사각형을 채우는 방법의 수인 dp[n-1]와 같다10.
- 마지막에 가로 타일 두 개를 놓는 경우: 앞부분은 2×(n-2) 크기의 직사각형을 채우는 방법의 수인 dp[n-2]와 같다10.
- 따라서 **dp[n] = dp[n-1] + dp[n-2]**가 된다3410.
2.3. 초기 조건
- dp1 = 1: 2×1 크기의 직사각형은 세로 타일 하나로만 채울 수 있다34.
- dp2 = 2: 2×2 크기의 직사각형은 세로 타일 두 개 또는 가로 타일 두 개로 채울 수 있다34.
3. 📈 규칙 패턴 분석
3.1. 피보나치 수열과의 관계
- 점화식 **dp[n] = dp[n-1] + dp[n-2]**은 피보나치 수열의 점화식과 동일한 형태를 갖는다414.
- 따라서 dp 배열의 값은 초기값만 다르고 성장 패턴은 피보나치 수열과 같이 진행된다14.
flowchart LR
A[dp[1]=1] --> B[dp[2]=2]
B --> C[dp[3]=3]
C --> D[dp[4]=5]
D --> E[dp[5]=8]
E --> F[dp[6]=13]
F --> G[dp[7]=21]
G --> H[dp[8]=34]
H --> I[dp[9]=55]
3.2. 각 n값에 따른 결과값
- n=1: 1가지 방법314
- n=2: 2가지 방법314
- n=3: 3가지 방법314
- n=4: 5가지 방법1014
- n=5: 8가지 방법1014
- n=6: 13가지 방법414
- n=7: 21가지 방법14
- n=8: 34가지 방법14
- n=9: 55가지 방법14
4. 💻 알고리즘 구현 방법
4.1. 바텀업(Bottom-Up) 접근법
def solution(n):
dp = [0] * (n + 1)
dp[1] = 1
dp[2] = 2
for i in range(3, n + 1):
dp[i] = (dp[i-1] + dp[i-2]) % 10007
return dp[n]
4.2. 탑다운(Top-Down) 접근법
def solution(n):
memo = [-1] * (n + 1)
memo[1] = 1
memo[2] = 2
def dp(n):
if memo[n] != -1:
return memo[n]
memo[n] = (dp(n-1) + dp(n-2)) % 10007
return memo[n]
return dp(n)
4.3. 파이썬 구현 예시
import sys
input = sys.stdin.readline
def tile_2xn():
n = int(input())
MOD = 10007
dp = [0] * 1001
dp[1] = 1
dp[2] = 2
for i in range(3, n + 1):
dp[i] = (dp[i-1] + dp[i-2]) % MOD
return dp[n]
print(tile_2xn())
5. 🔍 시간 복잡도와 공간 복잡도 분석
5.1. 시간 복잡도
5.2. 공간 복잡도
6. 🧠 문제 해결을 위한 심화 해석
6.1. 수학적 증명 접근
- 이 문제는 조합론적으로도 접근할 수 있다4.
- n이 짝수(2m)일 때와 홀수(2m+1)일 때로 나누어 이항계수의 합으로 표현할 수 있다4.
- 결과적으로 이항계수의 합이 피보나치 수열과 동일한 형태를 보인다4.
6.2. 모듈러 연산 주의사항
7. 📚 유사 문제 및 응용
7.1. 관련 문제들
- 2×n 타일링 2(백준 11727번): 1×2, 2×1, 2×2 타일로 채우는 방법의 수를 구하는 문제17.
- 프로그래머스 2×n 타일링: 동일한 문제로 다른 사이트에서도 출제된다318.
7.2. 응용 가능 분야
8. 🔑 핵심 포인트 정리
8.1. 문제 해결의 핵심
8.2. DP 문제 접근 방법
text1 : dp[1]=1 (세로 타일 1개)
2 : dp[2]=2 (세로 타일 2개 또는 가로 타일 2개)
3 : dp[3]=3 (dp[2]에 세로 타일 1개 추가 + dp[1]에 가로 타일 2개 추가)
4 : dp[4]=5 (dp[3]에 세로 타일 1개 추가 + dp[2]에 가로 타일 2개 추가)
5 : dp[5]=8 (dp[4]에 세로 타일 1개 추가 + dp[3]에 가로 타일 2개 추가)
8.3. 코드 작성 시 주의사항
9. 🎯 종합 요약
본 문제는 동적 프로그래밍의 기초적인 개념을 이해하고 적용하는 좋은 예제이다. 직사각형을 타일로 채우는 방법의 수를 구하는 과정에서 **점화식 dp[n] = dp[n-1] + dp[n-2]**를 도출하였고, 이는 피보나치 수열과 동일한 형태를 가진다.
초기값 dp1 = 1, dp2 = 2에서 시작하여 n까지 순차적으로 계산하는 바텀업 방식이 가장 효율적이며, 계산 과정에서 정수 오버플로우를 방지하기 위해 10,007로 나눈 나머지를 지속적으로 저장해야 한다.
이 문제는 타일링 문제의 기초가 되며, 다양한 변형 문제로 확장될 수 있어 알고리즘 학습에 있어 중요한 기반이 된다.
Citations:
- https://onlinejudgeimages.s3-ap-northeast-1.amazonaws.com/problem/11726/1.png
- https://www.acmicpc.net/problem/11726
- https://wwlee94.github.io/category/algorithm/dp/2xn-tiling/
- https://escape-portal.tistory.com/20
- https://risingcurve.tistory.com/15
- https://namoonsu-archive.tistory.com/5
- https://www.youtube.com/watch?v=kMEb_BzyUqk
- https://velog.io/@junho5336/Mermaid-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%84%9C-%EC%84%A4%EA%B3%84%ED%95%98%EA%B8%B0
- https://stackoverflow.com/questions/34900076/how-to-use-markdown-to-display-timeline
- https://yabmoons.tistory.com/506
- https://ldgeao99.tistory.com/281
- https://apple-apeach.tistory.com/12
- https://www.youtube.com/watch?v=8z2SRtYpJuQ
- https://velog.io/@j3beom/%EB%B0%B1%EC%A4%80-11726%EB%B2%88-2xn-%ED%83%80%EC%9D%BC%EB%A7%81-Python-DP
- https://hongjw1938.tistory.com/49
- https://brunch.co.kr/@@uSr/4160
- https://girawhale.tistory.com/33
- https://hstory0208.tistory.com/entry/Java%EC%9E%90%EB%B0%94-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Lv2-2-x-n-%ED%83%80%EC%9D%BC%EB%A7%81DP-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98
- https://www.heropy.dev/p/B74sNE
- https://lee1201zxc.tistory.com/entry/%EB%B0%B1%EC%A4%80-11726-2%C3%97n-%ED%83%80%EC%9D%BC%EB%A7%81C%EC%96%B8%EC%96%B4-C
- https://blog.naver.com/tlstjd436/221985176983
- https://olait.tistory.com/46
- https://mermaid.js.org/syntax/timeline.html
- https://velog.io/@pexe99/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-2-x-n-%ED%83%80%EC%9D%BC%EB%A7%81
- https://poalim.tistory.com/39
- https://walking-and-walking.com/entry/Python%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%8F%99%EC%A0%81-%EA%B3%84%ED%9A%8D%EB%B2%95Dynamic-Programming%EC%9D%98-%EA%B8%B0%EC%B4%88%EC%99%80-%EC%9D%91%EC%9A%A9
- https://justsunblog.com/entry/ChatGPT%EC%99%80-YouTube-Summary%EB%A1%9C-%EC%9C%A0%ED%8A%9C%EB%B8%8C-%EC%98%81%EC%83%81-%ED%95%B5%EC%8B%AC-%EB%82%B4%EC%9A%A9-%EC%9A%94%EC%95%BD-%EB%B0%8F-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%B6%94%EC%B6%9C%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95-%EC%8B%9C%EA%B0%84-%EC%A0%88%EC%95%BD-%ED%8C%81-%EA%B3%B5%EA%B0%9C
- https://swifty-cody.tistory.com/129
- https://studying404.tistory.com/27
- https://velog.io/@ready2start/Python-%EB%B0%B1%EC%A4%80-11727-2n-%ED%83%80%EC%9D%BC%EB%A7%81-2
- https://doing7.tistory.com/75
- https://www.gpters.org/nocode/post/zA8qPMSnBc6Uinv
- https://clickup.com/ko/blog/270823/mermaid-diagram-examples
- https://www.youtube.com/watch?v=D1TsU1YTeFI
- https://www.youtube.com/watch?v=fF8BlWv8W10
- https://dev-taerin.tistory.com/7
- https://velog.io/@if-else/%EC%9E%90%EC%A3%BC-%EC%93%B0%EC%9D%B4%EB%8A%94-%EB%A7%88%ED%81%AC%EB%8B%A4%EC%9A%B4-%EB%AC%B8%EB%B2%95%EB%93%A4-with-%EC%98%B5%EC%8B%9C%EB%94%94%EC%96%B8
- https://blog.naver.com/edu-next/223116887978
- https://sabarada.tistory.com/209
- https://cloud.google.com/looker/docs/using-markdown-in-text-tiles
- https://velog.io/@imdemo/Tech-Markdown%EB%A7%88%ED%81%AC%EB%8B%A4%EC%9A%B4-%EC%A0%95%EB%A6%AC
- https://dev-box.tistory.com/35
- https://velog.io/@qhflrnfl4324/Mermaid%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%8B%9C%ED%80%80%EC%8A%A4-%EB%8B%A4%EC%9D%B4%EC%96%B4%EA%B7%B8%EB%9E%A8
- https://helpdesk.dooray.com/share/pages/9wWo-xwiR66BO5LGshgVTg/3216291598897944508
- https://theorydb.github.io/envops/2019/05/22/envops-blog-how-to-use-md/
- https://github.com/wangwei1237/hexo-tag-mdline/blob/main/README.md
- https://qiita.com/takarake/items/2f98398165c631ec65e2
- https://hexo.io/api/tag
- https://zenn.dev/backpaper0/articles/0d1aa54146b091
- https://www.youtube.com/watch?v=8z2SRtYpJuQ
- https://hexo.io/plugins/
- https://markwhen.com
- https://learn.microsoft.com/ko-kr/azure/devops/pipelines/scripts/logging-commands?view=azure-devops
- https://npms.io/search?q=mdline
- https://github.com/mark-when/markwhen
- https://skyksit.com/hexo/hexo-make-script/
- https://donghak-dev.tistory.com/46
- https://www.youtube.com/watch?v=v_x3JJzaqnc
- https://openmynotepad.tistory.com/6
- https://code-piggy.tistory.com/entry/%EB%B0%B1%EC%A4%80-C-11726-%ED%92%80%EC%9D%B4
- https://www.youtube.com/watch?v=6C2KwWlpMh4
- https://hongjw1938.tistory.com/49
- https://wooono.tistory.com/600
- https://dbstndi6316.tistory.com/73
- https://kosaf04pyh.tistory.com/222
- https://velog.io/@qazws78941/python%EB%B0%B1%EC%A4%80-11726-%ED%92%80%EC%9D%B4
- https://jie0025.tistory.com/156
- https://gist.github.com/ninanung/946cd0e2e09bd5a94964ff8b612a9012
- https://stackoverflow.com/questions/34900076/how-to-use-markdown-to-display-timeline
- https://cloud.google.com/apigee/docs/api-platform/publish/portal/markdown-reference
- https://github.com/wangwei1237/hexo-tag-mdline
- https://gigazine.net/gsc_news/en/20241207-markdown-timeline-markwhen/
- https://gitlab-docs.infograb.net/ee/user/markdown.html
- https://duckracoon.tistory.com/entry/%EB%B0%B1%EC%A4%80-11726-2xn-%ED%83%80%EC%9D%BC%EB%A7%81-%ED%95%B4%EC%84%A4-python
- https://blog.naver.com/kqng_diary/221462972715
- https://didu-story.tistory.com/222