프로그래머스 단어퍼즐 c++
2023. 9. 29. 16:59ㆍ알고리즘
처음에는 완전 탐색으로 구현할까 생각했지만, 테스트케이스를 보고 dp로 풀어야겠다고 생각했다.
점화식은 다음과 같다.
dp[i] = i번째 string까지 만들 수 있는 최소비용
d[i] ~ d[t.size()-1] 까지 순회를 돌면서 각각의 strs 원소가 들어가는지 확인하고, 들어가면
dp[i] = min(dp[place-1]+1, dp[i])로 최소비용을 업데이트해준다.
그리고 첫번째 값의 경우에는 dp[place-1] 값이 존재하지 않는다. 이럴때는 1로 초기화해준다. 왜냐하면 banana 에서 b라면 최초의 경우라 1로 값이 설정되기 때문이다.
이렇게 dp로 풀어야한다.
처음에 이렇게 풀었지만, 효율성조건을 만족하지 못했다. 이는 c++ string의 시간이 오래걸리기 때문이다. 처음에는 주석처리한 부분처럼 substr을 사용해서 풀었으나 이 때 정확성 조건은 만족했지만 효율성 조건이 위배되었다. 그래서 substr이 아닌 스트링을 비교하게 for 루프를 짰다.
코드는 아래와 같다.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int dp[20001];
int solution(vector<string> strs, string t)
{
int answer = 0;
for (int i=0;i<=20001;i++){
dp[i]=20001;
}
// dp[i] = i번째 자리까지를 만족시키는 최솟값
for (int i=0;i<t.size();i++){
for (int j=0;j<strs.size();j++){
int place = i-strs[j].size()+1;
if (place<0) continue;
int flag=0;
for (int k=0;k<strs[j].size();k++){
if (t[place+k]!=strs[j][k]){
flag=1;
}
}
if (flag==0){
if (place-1<0){
dp[i]=1;
}else{
dp[i] = min(dp[i], dp[place-1]+1);
}
}
}
}
answer = dp[t.size()-1];
if (answer==20001){
return -1;
}
return answer;
}
실행 결과는 아래와 같다. 점수가 표시가 된다
'알고리즘' 카테고리의 다른 글
프로그래머스 타겟넘버 C++ (0) | 2023.09.30 |
---|---|
백준 균형잡힌 세상 C++ (0) | 2023.09.29 |
백준 11005 진법 변환 2 C++ (0) | 2023.09.29 |
백준 1913 C++ (0) | 2023.09.29 |
프로그래머스 가장 큰 수 C++ (0) | 2023.09.21 |