3xn 타일링 Pgs#12902
3xN 타일링 PGs#12902
Python 코드 보기
def solution(n):
answer = 0
if n%2 == 1: # n이 홀수면 타일 채우기 불가능.
return 0
target = n//2 # 몇 번 DP를 실행할 지 결정
tiling = [0] * (target+1)
tiling[1] = 3 # 규칙을 따르는 값
extra = 2 # 규칙 외 값
for i in range(2,target+1):
tiling[i] = tiling[i-1]*3 + extra
extra += tiling[i-1]*2
answer = tiling[target]%1000000007
return answer
☝ 입력 형식
- 가로 길이가 2이고 세로의 길이가 1인 직사각형 모양의 타일이 있습니다.
-
직사각형 타일을 이용하여 세로의 길이가 3이고 가로의 길이가 n인 바닥을 가득 채우려고 합니다.
- 타일을 채울 때는 다음과 같이 2가지 방법이 있습니다
- 타일을 가로로 배치 하는 경우
- 타일을 세로로 배치 하는 경우
- 직사각형의 가로의 길이 n이 매개변수로 주어진다. (n <= 5000의 자연수)
🤞 출력 형식
- 경우의 수가 많아 질 수 있으므로, 경우의 수를 1,000,000,007으로 나눈 나머지를 return해주세요.
🤟 구현 과정
1. 알고리즘 결정
코드를 구현하기 앞서, 일일히 타일을 깔아보는 방식으로 해야 하는지, 점화식으로 규칙성을 유도할 수 있을지를 결정해야한다.
5000x3의 타일에 일일히 타일을 까는 방식은 시간 복잡도가 끔찍할 것이다. 그렇다면 규칙성을 찾아보는 것이 낫겠다.
2. 규칙성 찾기
- n=2 : 3가지 경우의 수
- n=4 : 11가지 경우의 수 = 3*3 + 2가지 경우의 수
- n=6 : 39가지 경우의 수 = 11*3 + 8= 2+(3*2)가지 경우의 수
- 4x3 타일을 까는 방법 = 2x3타일을 까는 방법*2x3타일을 까는 방법 + extra
- extra를 결정하는 점화식을 찾았는지 검사.
3. 점화식 설정
- extra = i-1번째까지 경우의 수의 합
- i+1번째 = i번째*3 + extra
4. 코딩
복잡하지 않은 점화식이므로, 간단히 구현할 수 있다.
🍀 Pain Points
1. 점화식 증명
- 만약 프로그래머스의 채점 기능을 통해서 내 점화식이 맞는지 확인할 수 없다면 어떻게 할 것인가?
- n=8일때만 되어도 100가지가 넘는데, 직접 그릴 건가에 대한 해결방안이 필요하다.
댓글남기기