https://school.programmers.co.kr/learn/courses/30/lessons/49993
map에 스킬의 알파벳과 그 인덱스를 담는데 이 인덱스는 해당 스킬을 배우는데 선행되는 스킬의 개수를 나타낸다.
그후 반복문을 돌리면서 스킬순서에 없는 알파벳은 거르고
스킬 알파벳의 선행스킬수와 skills 가 같으면 skills++하고
아니면 바로 break한다.
#include <string>
#include <vector>
#include <map>
using namespace std;
int solution(string skill, vector<string> skill_trees) {
int answer = 0;
map<char, int> sk;
for(int i = 0; i < skill.length(); i++)
sk[skill[i]] = i;
for(string s : skill_trees)
{
int skills = 0;
bool b = true;
for(int i = 0; i < s.length(); i++)
{
if(sk.find(s[i]) == sk.end())
continue;
if(sk[s[i]] == skills)
{
skills++;
}
else
{
b = false;
break;
}
}
if(b)
answer++;
}
return answer;
}
#include <string>
#include <vector>
using namespace std;
int solution(string skill, vector<string> skill_trees) {
int answer = 0;
bool check_skill = true;
string sk;
for (const auto& trees : skill_trees) {
for (const auto& k : trees) {
if (skill.find(k) != string::npos) { // k가 skill에 있는 스킬일 경우에만 저장
sk.push_back(k);
}
}
for (int i = 0; i < sk.length(); i++) {
if (sk[i] != skill[i]) { // 순서가 다르면 루프를 멈춘다.
check_skill = false;
break;
}
}
if (check_skill) { // 순서가 맞을 때만 증가
answer++;
}
check_skill = true;
sk.clear();
}
return answer;
}
skill_trees의 각 string에서 skill에 없는 알파벳을 먼저 제거한다.
그 후 skill과 제거된 string을 첫 원소부터 같은지 검사한다.