이로서, 프로그래머스 시스템 적응을 위한 모의테스트를 모두 마쳤다
https://programmers.co.kr/learn/courses/18/lessons/1882
처음에 봤을 때는 모르겠어서 풀지를 못해서 결국 어떤 방법을 쓰는지만 슬쩍 봤다. DP를 이용하는것이라는 것만 알고나니 스르륵 풀려갔다. 어떤 알고리즘을 적용해야하는지에 대한 안목이 필요하다
#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <limits.h>
using namespace std;
int solution(vector<string> strs, string t)
{
set<string> str_set(strs.begin(), strs.end()); // set
const int INF = 100001;
int len = t.size();
int dp[20001];
for(int i=0;i<len;i++) // 초기화
dp[i] = INF;
if(str_set.find(t.substr(0, 1)) != str_set.end())
dp[0] = 1;
for(int i=1;i<len;i++){
for(int j=1;j<=5;j++){
if(i-j<-1) // 더이상 갈 수 없어
break;
if( str_set.find(t.substr(i-j+1, j)) != str_set.end()){ // 찾아보기
dp[i] = min(dp[i], dp[i-j] + 1);
if(i-j+1 == 0){
dp[i] = 1;
break;
}
}
}
}
if(dp[len-1] == INF)
return -1;
return dp[len-1];
}
using namespace std;
int solution(vector<string> strs, string t)
{
set<string> str_set;
const inf INF = 987654321;
vector<int> dy(20002, INF);
int len = sentence.length();
for(int i=0;i<str_array.size();i++)
str_set.insert(str_array[i]);
dy[len] = 0;
for(int i=len-1;i >=0;--i){
for(int i=0;i + j<len && j<5 ;++j)
{
tmp += sentence[i+j];
if(str_set.find(tmp) != str_set.end() && dy[i+j+1] != INF)
dy[i] = min(dy[i+j+1]+1);
}
}
if(dy[0] == INF)
return -1;
return dy[0];
}