Programmers Code/Level 3_4

[Programmers] level4 - 단어 퍼즐 (Python) : 2017 팁스타운

NIMHO 2022. 8. 26. 21:52
728x90

▶단어 퍼즐 - 팁스타운 (level 4)

문제

단어 퍼즐은 주어진 단어 조각들을 이용해서 주어진 문장을 완성하는 퍼즐입니다. 이때, 주어진 각 단어 조각들은 각각 무한개씩 있다고 가정합니다. 예를 들어 주어진 단어 조각이 [“ba”, “na”, “n”, “a”]인 경우 "ba", "na", "n", "a" 단어 조각이 각각 무한개씩 있습니다. 이때, 만들어야 하는 문장이 “banana”라면 “ba”, “na”, “n”, “a”의 4개를 사용하여 문장을 완성할 수 있지만, “ba”, “na”, “na”의 3개 만을 사용해도 “banana”를 완성할 수 있습니다. 사용 가능한 단어 조각들을 담고 있는 배열 strs와 완성해야 하는 문자열 t가 매개변수로 주어질 때, 주어진 문장을 완성하기 위해 사용해야 하는 단어 조각 개수의 최솟값을 return 하도록 solution 함수를 완성해 주세요. 만약 주어진 문장을 완성하는 것이 불가능하면 -1을 return 하세요.

 

제한사항

  • strs는 사용 가능한 단어 조각들이 들어있는 배열로, 길이는 1 이상 100 이하입니다.
  • strs의 각 원소는 사용 가능한 단어 조각들이 중복 없이 들어있습니다.
  • 사용 가능한 단어 조각들은 문자열 형태이며, 모든 단어 조각의 길이는 1 이상 5 이하입니다.
  • t는 완성해야 하는 문자열이며 길이는 1 이상 20,000 이하입니다.
  • 모든 문자열은 알파벳 소문자로만 이루어져 있습니다.

 

입출력 예

입출력 예 #1
문제의 예시와 같습니다.

입출력 예 #2
"ap" 1개, "ple" 1개의 총 2개로 "apple"을 만들 수 있으므로 필요한 단어 개수의 최솟값은 2를 return 합니다.

입출력 예 #3
주어진 단어로는 "banana"를 만들 수 없으므로 -1을 return 합니다.

풀이

스킬 체크 level 4를 풀면서 발견한 문제이다.

level 4를 많이 풀어보지 못해서 풀 수 있을까 했지만 생각보다 간단한 문제였다.

 

dynamic programming(dp)를 이용해서 푸는 문제이다.

예를 들어서 banana가 있고, ba를 넣으려고 한다.

그럼 처음에 ba에 들어갈 수 있고, dp에서 a에 해당하는 dp[2]의 값을 변경해주면 된다.

 

다음으로 na가 들어왔다고 치면, dp[4]의 값은 na2개를 더 받기 전인 dp[2]의 값에 영향을 받는다.

그렇게 점차 비교해주면서 min값을 취해주면 되는 문제이다.

def solution(strs, t):
    n = len(t)
    strs = set(strs)
    dp = [0 for i in range(n + 1)]
    
    for i in range(1, n + 1):
        dp[i] = 999999999
        for k in range(1, 6):
            if i - k < 0:
                break
            s = i - k
            if t[s:i] in strs:
                dp[i] = min(dp[i], dp[i - k] + 1)

    if dp[-1] == 999999999:
        return -1
    else:
        return dp[-1]

처음에는 당황해서 못 풀었지만 결국에는 해냈다.

 

다른 테스트 문제로는 'level 4 호텔 방배정'이 있었다.

그 문제는 정확성에서는 만점을 받았지만, 효율성에서 0점을 받았다.

 

단순 반복과 재귀 두 가지로 풀었지만 못했다... 다음번에 꼭 다시 성공하도록 하겠다.

 

728x90