-
백준 11726 파이썬 | 2xn 타일링알고리즘 BOJ 2021. 9. 2. 15:41
코드
from sys import stdin input = stdin.readline n = int(input()) dp = [0, 1, 2] for i in range(3, n+1): dp.append(dp[i-2] + dp[i-1]) print(dp[n]%10007)
설명
2xn 크기의 직사각형을 1x2, 2x1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하면 된다.
문제를 봤을 때 수학 문제를 풀 때 처럼 경우의 수를 이용하여 풀 수도 있을거라는 생각이 들었다. 하지만 알고리즘 문제이기 때문에 알고리즘을 풀 듯이 풀어야한다. 여러 문제를 풀며 느낀건데, 간단한 공식을 알고 있어서 그걸 알고리즘에 적용하는 것은 괜찮아도 완전히 알고리즘 문제를 수학 문제 풀듯이 접근하는 것은 좋지 않은 것 같다.
아무튼 알고리즘을 풀듯이 접근 해 보면 일단 n의 크기가 1부터 하나씩 커지니 n = 1, 2, 3 ... 일 때 출력이 어떻게 되는지 알아보았다.
n = 1 -> 1
n = 2 -> 2
n = 3 -> 3
n = 4 -> 5
이런 결과가 나온다. 여기까지 해보면 이 수열은 피보나치 수열이 아닐까 하는 강한 의심이 든다. 실제로 n = 5 일 때도 직접 그려보면 결과는 8이 된다. 하지만 n의 숫자가 커질 수록 경우의 수를 하나하나 세기가 귀찮기 때문에 규칙이 있는 것 같으면 일단 만들어 보고 예제 출력과 비교해 보거나 제출 하고 결과를 봐 보는 것이 낫다.
피보나치 수열을 동적프로그래밍을 이용하여 구현 할 때와 동일한 방법으로 알고리즘을 구현하면 된다. 그리고 10,007로 나눈 나머지를 출력하라고 했으므로 마지막에 나머지 연산을 추가해야 한다. 나는 마지막에 나머지 연산을 안 해서 한 번 틀렸다 ㅋㅋ.
메모리: 29200 KB
시간: 80 ms
문제
https://www.acmicpc.net/problem/11726
11726번: 2×n 타일링
2×n 크기의 직사각형을 1×2, 2×1 타일로 채우는 방법의 수를 구하는 프로그램을 작성하시오. 아래 그림은 2×5 크기의 직사각형을 채운 한 가지 방법의 예이다.
www.acmicpc.net
'알고리즘 BOJ' 카테고리의 다른 글
백준 9375 파이썬 | 패션왕 신해빈 (0) 2021.09.02 백준 11727 파이썬 | 2xn 타일링 2 (0) 2021.09.02 백준 9461 파이썬 | 파도반 수열 (0) 2021.08.31 백준 11659 파이썬 | 구간 합 구하기 4 (0) 2021.08.31 백준 11399 파이썬 | ATM (0) 2021.08.31