본문 바로가기
알고리즘

프로그래머스 단어 퍼즐 (python, 파이썬)

by 블쭌 2021. 5. 13.
728x90
  • 문제 설명

단어 퍼즐은 주어진 단어 조각들을 이용해서 주어진 문장을 완성하는 퍼즐입니다. 이때, 주어진 각 단어 조각들은 각각 무한개씩 있다고 가정합니다. 예를 들어 주어진 단어 조각이 [“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 이하입니다.
    • 모든 문자열은 알파벳 소문자로만 이루어져 있습니다.

  • 입/출력
strs t result
["ab", "na", "n", "a", "bn"] "nabnabn" 4
["ba","na","n","a"] "banana" 3
["app","ap","p","l","e","ple","pp"] "apple" 2
["ba","an","nan","ban","n"] "banana" -1

코드를 실행하면 테스트 케이스가 하나 더 보이길래 추가해보았습니다.


  • 코드
import sys

def solution(strs, t):
    answer = 0
    strs = set(strs) # 중복제거
    n = len(t) 
    dp = [sys.maxsize]*(n+1)
    dp[0] = 0 # dp의 첫번째 값은 아무 의미없기 때문에 0으로 처리

	for i in range(n):
        s = i
            
        for j in range(1, 6):
            e = s + j
            if e > n:
                break
        
            string = t[s:e]
            if string in strs:
                dp[e] = min(dp[s]+1, dp[e])
                
    return -1 if dp[-1] == sys.maxsize else dp[-1]

단어의 최대 길이가 5개라는 것이 중요한 포인트이다.

 

"banana"라고 가정을하면

 

"b" -> "b", "ba", "ban", "bana", "banan" 

"a" -> "a", "an", "ana", "anan", "anana"

"n" -> "n", "na", "nan", "nana" (길이가 n을 넘어가면 계산하지 않는다 위 코드에서 break문이 그것을 의미합니다)

"a" -> "a", "an", "ana"

"n" -> "n", "na"

"a" -> "a"

 

위에만든것이 string = t[s:e]로 들어오는것이다.

 

이후 해당 string이 문자조각 strs안에 있다면 dp를 진행해주면 된다.

end지점의 값(dp[e])는 시작 지점의 값(dp[s])에다가 해당 문자조각을 1개 추가한 값이 현재 지점의 값보다 작다면 값을 바꿔주면된다.

 

마지막 지점의 값이 바뀌지 않았다면 만들지 못하므로 -1을 return 해준다.


  • 출처

https://programmers.co.kr/learn/courses/30/lessons/12983?language=python3

728x90

댓글