문제 후기

단순히 숫자의 조합으로 해결할 수 있어서 처음에는 같은 수가 있는 순열 식을 활용하려 했다.

문제를 예를 들면 [2,1(a),1(b)] [2,1(b),1(a)] 와 같은 것이다.

계산 하는 방식은 총 갯수 n, 중복하는 숫자의 갯수 m이면 n!/ m! 이다. 따라서 1,2의 갯수만큼 나누는 것으로 했다. 하지만 Factorial의 특성으로 인해서 특정 숫자를 넘어가면 시간초과가 발생했다.

다시 처음부터 경우의 수를 확인해본 결과 1,2,3,5,8,13... 순으로 피보나치수열인 것을 확인할 수 있었다.

문제 설명

가로 길이가 2이고 세로의 길이가 1인 직사각형모양의 타일이 있습니다. 이 직사각형 타일을 이용하여 세로의 길이가 2이고 가로의 길이가 n인 바닥을 가득 채우려고 합니다. 타일을 채울 때는 다음과 같이 2가지 방법이 있습니다.

  • 타일을 가로로 배치 하는 경우
  • 타일을 세로로 배치 하는 경우

예를들어서 n이 7인 직사각형은 다음과 같이 채울 수 있습니다.

직사각형의 가로의 길이 n이 매개변수로 주어질 때, 이 직사각형을 채우는 방법의 수를 return 하는 solution 함수를 완성해주세요.

제한사항

  • 가로의 길이 n은 60,000이하의 자연수 입니다.
  • 경우의 수가 많아 질 수 있으므로, 경우의 수를 1,000,000,007으로 나눈 나머지를 return해주세요.

입출력 예

nresult

n result
4 5

입출력 예 설명

입출력 예 #1
다음과 같이 5가지 방법이 있다.


# 같은 수가 있을 때 순열 공식을 활용.
def solution(n):
    answer = 1
    count_one = n - 2
    count_two = 1

    while count_one > 1:

        answer += math.factorial(count_one+count_two) // (math.factorial(count_one) * math.factorial(count_two))
        count_one -= 2
        count_two += 1

        # print(answer)
        # print(count_one, count_two)
    if count_one == 1:
        answer += math.factorial(count_one + count_two) // (math.factorial(count_one) * math.factorial(count_two))
    else:
        answer += 1
    return answer % 1000000007
# 피보나치 수열로 계산
def solution(n):
	answer = 1
    start1 = 1
    start2 = 2

    num = 2
    while num < n:
        answer = start1 + start2
        start1 = start2
        start2 = answer
        num += 1
    return answer % 1000000007

+ Recent posts