https://school.programmers.co.kr/learn/courses/30/lessons/12983
문제 설명
단어 퍼즐은 주어진 단어 조각들을 이용해서 주어진 문장을 완성하는 퍼즐입니다. 이때, 주어진 각 단어 조각들은 각각 무한개씩 있다고 가정합니다. 예를 들어 주어진 단어 조각이 [“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 합니다.
정답 코드
def solution(strs, t):
INF = 99999
dp = [INF] * len(t) + [0]
for i in range(len(t)-1, -1, -1):
for j in range(1, min(6, len(t)-i+1)):
if t[i:i+j] in strs:
dp[i] = min(dp[i], dp[i+j]+1)
return -1 if dp[0]==INF else dp[0]
풀이
dp를 활용한 풀이
1. 주어진 문자열이 t, t의 길이가 n이라면
ex) t="apple" 이라면 t[0]='a', t[1]='p', ...., t[4]='e'
2. INF = 99999로 설정 (큰 값, MIN함수로 작은 값을 비교하기 위해 설정)
3. 두개의 for문으로 뒤에서부터 t의 길이만큼 차례로 반복하여 탐색
dp[4]='e'이고 1, dp[3]=min(dp[3],dp[4]+1) 그럼 dp[3]은 2가 되고
dp[2]=min(dp[2],dp[3]+1) dp[3]이 2이였으므로 min(dp[2], 3)을 비교한다.
'pl'의 조각은 없으며, 'ple'조각은 dp[2]=min(dp[2], dp[5]+1)
dp[5]는 0으로 간주함.
4. 지금까지 실행된 값은 dp[4]=1 {e} , dp[3]=2 {l,e}, dp[2]=1 {ple}이다.
5. 'p'를 단어 조각으로 만드는 경우
dp[1] = min(dp[1], dp[2]+1)
즉, dp[1]=min(INF, 2)가 되는 것이다.
'pp'를 단어 조각으로 만드는 경우는 dp[1] = min(dp[1],dp[3]+1)
dp[1]은 2이다.
6. 최종적으로 dp[0]의 값도 2가 되며, 최소 개수는 2개로 출력된다.
'Coding Test > Python' 카테고리의 다른 글
[프로그래머스] 최댓값과 최솟값 | Python - 민민의 하드디스크 - 티스토리 (0) | 2023.04.12 |
---|---|
[프로그래머스] 롤케이크 자르기 | Python - 민민의 하드디스크 - 티스토리 (0) | 2023.04.12 |
[프로그래머스] 구명보트(탐욕법) | Python - 민민의 하드디스크 - 티스토리 (0) | 2023.04.12 |
[프로그래머스] 힙(Heap) 이중우선순위큐 | Python - 민민의 하드디스크 - 티스토리 (0) | 2023.04.12 |
[프로그래머스] 숫자 짝꿍 | Python - 민민의 하드디스크 - 티스토리 (0) | 2023.03.23 |