https://school.programmers.co.kr/learn/courses/30/lessons/160586
targets의 string 하나하나 마다 한글자씩 keymap에서 찾아서 가장 짧은 횟수를 찾아 answer에 넣어준다. 못만드는 단어의 경우 -1을 넣어준다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<string> keymap, vector<string> targets) {
vector<int> answer(targets.size(),0);
for(int i = 0; i < targets.size(); i++)
{
vector<int> num(targets[i].size(),101);
for(int j = 0; j < targets[i].size(); j++)
{
for(int k = 0; k < keymap.size(); k++)
{
if(keymap[k].find(targets[i][j]) != string::npos)
{
if(num[j] != -1)
num[j] = min(num[j],(int)(keymap[k].find(targets[i][j])));
else
num[j] = keymap[k].find(targets[i][j]);
}
else if(num[j] == 101)
num[j] = -1;
}
}
for(const auto& n : num)
{
if(n != -1)
answer[i] += n + 1;
else
{
answer[i] = -1;
break;
}
}
}
return answer;
}
#include <string>
#include <vector>
using namespace std;
vector<int> solution(vector<string> keymap, vector<string> targets) {
vector<int> answer;
const int MARKER = 1000000;
vector<int> table(26,MARKER);
for(const auto& v : keymap)
{
for(int i = 0; i < v.size();++i)
{
table[v[i]-'A'] = min(table[v[i]-'A'],i+1);
}
}
for(const auto& str : targets)
{
int total = 0;
for(const auto c : str)
{
if(table[c-'A'] == MARKER)
{
total = -1;
break;
}
else
{
total += table[c-'A'];
}
}
answer.emplace_back(total);
}
return answer;
}
table이라는 컨테이너에 A,B,C...Z까지 입력할 때 필요한 최소 횟수를 미리 저장해둔다. 그 후 targets의 원소 하나하나의 횟수를 해결해나간다.