문제

셀수있는 수량의 순서있는 열거 또는 어떤 순서를 따르는 요소들의 모음을 튜플(tuple)이라고 합니다. n개의 요소를 가진 튜플을 n-튜플(n-tuple)이라고 하며, 다음과 같이 표현할 수 있습니다.

(a1, a2, a3, …, an)

튜플은 다음과 같은 성질을 가지고 있습니다.

  1. 중복된 원소가 있을 수 있습니다. ex : (2, 3, 1, 2)
  2. 원소에 정해진 순서가 있으며, 원소의 순서가 다르면 서로 다른 튜플입니다. ex : (1, 2, 3) ≠ (1, 3, 2)
  3. 튜플의 원소 개수는 유한합니다.
  4. 원소의 개수가 n개이고, 중복되는 원소가 없는 튜플 (a1, a2, a3, …, an)이 주어질 때(단, a1, a2, …, an은 자연수), 이는 다음과 같이 집합 기호 ‘{‘, ‘}’를 이용해 표현할 수 있습니다.

특정 튜플을 표현하는 집합이 담긴 문자열 s가 매개변수로 주어질 때, s가 표현하는 튜플을 배열에 담아 return 하도록 solution 함수를 완성해주세요.

문제 풀러 가기


풀이


  1. 문자열 분리 및 형식 변환:
    • 주어진 문자열 s를 split(‘},’) 함수를 이용해 ‘},’를 기준으로 분리하여 각 원소 집합을 문자열 형태로 나눈다.
    • 이후 각 원소 집합에서 ‘{‘와 ‘}’를 제거하고 split(‘,’)을 통해 원소들을 개별 숫자로 나눈다.
  2. 리스트 정렬:
    • 원소의 개수에 따라 리스트를 오름차순 정렬하여 각 원소 집합이 중첩되는 순서대로 정렬한다.
    • 예를 들어, {2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}와 같은 순서로 정렬한다.
  3. 중복 제거 및 순서 추출:
    • 순서대로 정렬된 리스트에서 중복되지 않는 원소만 추출하여 최종 answer 배열에 추가한다.
    • 이미 answer에 있는 원소는 추가하지 않도록 하여 중복을 방지한다.
  4. 최종 답 반환:
    • answer 리스트에 모든 원소가 추가되면 최종적으로 완성된 튜플 순서가 반환된다.

코드

def solution(n, money):    
    # n+1 크기의 DP 테이블 생성 (0 ~ n)
    dp = [0] * (n + 1)
    
    # 초기값: 0원을 만드는 방법은 1가지 (아무 동전도 사용하지 않음)
    dp[0] = 1
    
    # 각 동전을 사용하여 경우의 수 갱신
    for m in money:
        for price in range(m, n+1):
            dp[price] += dp[price - m]
    
    # 최종 결과를 1000000007로 나눈 나머지 반환
    return dp[-1] % 1000000007