ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BOJ 9095 1,2,3 더하기 python
    코딩테스트 2024. 4. 16. 11:45

    이 문제를 보고 떠올렸던 생각은

    1. 메모리가 낭낭하다

    2. 어렸을 때 많이 했던 점화식 만들기와 형태가 유사하다

    -> dp로 풀어야겠다!

     

    였는데 사실, 테스트케이스를 보고 먼저 점화식을 예상한 다음에 이유를 생각해봤다. 이러면 안 된다!

    1 -> 1 (1)

    2 -> 2 (1+1, 2)

    3 -> 4 (1+1+1, 2+1, 1+2, 3)

    4 -> 7 (위 사진 참조)

    ...

     

    어라?

    An = An-1 + An-2 + An-3 아냐? -> 맞다.

    예를 들어, 10을 만들기 위해서는 7을 만드는 가지수 + 8을 만드는 가지수 + 9를 만드는 가지수 를 더하면 된다.

    사진에 있는 4를 만들기 위해서, 마지막 수를 제외한 앞 수들의 합이 같은 수들로 묶어보면

    • 1
      • 1
    • 2
      • 1+1
      • 2
    • 3
      • 1+1+1
      • 1+2
      • 2+1
      • 3

    위와 같이 나타낼 수 있다. 이 때, 어떻게든 n-3, n-2, n-1을 만들었다면, 마지막에 3, 2, 1 을 더해주기만 하면 된다!


    import sys
    
    T = int(sys.stdin.readline())
    
    input_list = []
    for _ in range(T):
        t = int(sys.stdin.readline())
        input_list.append(t)
    
    dp = [0] * (max(input_list)+1)
    
    dp[1] = 1
    dp[2] = 2
    dp[3] = 4
    for i in range(4,T+1):
        dp[i] = dp[i-3] + dp[i-2] + dp[i-1]
    
    print(dp)

    마찬가지로 An의 값을 담을 리스트를 할당한다. 메모리를 사용해서 연산 속도를 비약적으로 높이는 것이 dp의 핵심이다.

    구현은 매우 간단한 문제다. 다만 점화식을 떠올리고 식으로 작성하는 부분이 조금 더 어려웠다.

    '코딩테스트' 카테고리의 다른 글

    BOJ 1149 RGB 거리 python  (0) 2024.04.16
    BOJ 11726 2×n 타일링 python  (0) 2024.04.16
    BOJ 1463 1로 만들기 python  (0) 2024.04.15
    BOJ 1064 - 평행사변형  (0) 2023.03.19
    BOJ 1874 - 스택 수열  (0) 2023.03.19
Designed by Tistory.