이 문제는 구현문제이다.
각 target 문자열 (ex, "ABCD", "AABB")에 대하여 keymap 중 적게 눌러서 target 문자열의 각 문자('A','B','C','D')를 찾는 key 누르는 횟수를 누적하여 해당 target문자열의 최소 누름 횟수를 저장하면 된다.
1번키 ABACD 2번키는 BCEFD
target: ABCD
즉, 각 타겟문자열 (targets[i])의 각 문자 (targets[i][j])에 대해 keymap[k].find(targets[i][j]+1) 가 작은 값이 최소 횟수이다.
각 문자에 대한 최소 횟수의 합은 해당 타겟문자열의 키 누르기 최솟값이다.
타겟문자열의 임의의 문자를 keymap의 모든 문자열들 중에서 찾지 못했다면 ans = -1 로 설정하고 바로 반복문을 빠져나오면 된다.
#include <string>
#include <vector>
#include <cmath>
#include <iostream>
using namespace std;
vector<int> solution(vector<string> keymap, vector<string> targets) {
vector<int> answer;
// 키 최대 100개
// 키를 최소 몇번 눌러야 그 문자열 작성
// 1번키 ABACD 2번키는 BCEFD
// target: ABCD
// 1번키 1
// 2번키 1
// 2번키 2
// 1번키 5
for(int i=0; i<targets.size(); i++) {
string now_t = targets[i];
int ans = 0;
for(int j=0; j<now_t.size(); j++) {
size_t tmp = 104;
for(int k=0; k<keymap.size(); k++) {
size_t fin = keymap[k].find(now_t[j]);
if (fin != string::npos) {
tmp = min(tmp, fin+1);
continue;
}
}
if (tmp == 104) {
ans = -1;
break;
}
else {
ans += tmp;
}
}
answer.push_back(ans);
}
return answer;
}