문제주소 :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 이하입니다.
- 모든 문자열은 알파벳 소문자로만 이루어져 있습니다.
입출력 예
strs t result[ba,na,n,a] | banana | 3 |
[app,ap,p,l,e,ple,pp] | apple | 2 |
[ba,an,nan,ban,n] | banana | -1 |
입출력 예 설명
입출력 예 #1
문제의 예시와 같습니다.
입출력 예 #2
ap 1개, ple 1개의 총 2개로 apple을 만들 수 있으므로 필요한 단어 개수의 최솟값은 2를 return 합니다.
입출력 예 #3
주어진 단어로는 banana를 만들 수 없으므로 -1을 return 합니다.
<풀이법>
▒ 한줄 개념: 동적계획법 ▒
동적 계획법으로 풀어야하는 문제입니다. 단순 비교반복을 하면 효율성 테스트에서 실패합니다.
LIS와 비슷한 방식으로 풀면 어렵지 않게 풀 수 있습니다.
[백준11053] 가장 긴 증가하는 부분 수열 (LIS) / Java 풀이 보기
반복문을 통해 dp값을 저장해나가게 되는데, 각 dp값은 다음과 같이 들어갑니다.
strs = ['app','ap','p','l','e','ple','pp'] / t = 'appleapple'의 경우에서, i = 7 이라고 가정한다면, dp[7] 의 값은 그림과 같습니다
문제에 조건에 제시된 단어 조각의 길이는 1~5입니다.
- 그림과 같이 앞 5개를 각각 슬라이싱하여 후보군을 만들어야합니다.
- 그리고 각 후보군이 strs에 존재한다면, 값을 가져오고, 모든 값을 비교해서 최솟값을 얻어내줍니다.
- 이 최솟값에 1을 더해주게 되면, 그것이 dp[7]의 값이 되는 것입니다.
<코드(Python)>
import math
def solution(strs, t):
default = math.inf
dp = [default for i in range(len(t)+1)]
dp[0] = 0
for i in range(1,len(t)+1):
j = i - 5 if i > 5 else 0
while j < i:
if dp[j] + 1 < dp[i] and t[j:i] in strs:
dp[i] = dp[j]+1
j += 1
return dp[len(t)] if dp[len(t)] != default else -1
더 많은 코드 보기(GitHub) : github.com/dwkim-97/CodingTest
'Programmers' 카테고리의 다른 글
[프로그래머스] 3 x n 타일링 / Python (1) | 2021.02.16 |
---|---|
[프로그래머스] 블록 이동하기 / Python (0) | 2021.02.08 |
[프로그래머스] 게임 맵 최단거리 / Python (0) | 2021.02.07 |
[프로그래머스] 선입 선출 스케줄링 / Python (1) | 2021.02.07 |
[프로그래머스] 올바른 괄호의 갯수 / Python (0) | 2021.02.06 |