어제 푼 알고리즘이 구현 문제였는데 너무 어려웠어서..이번에도 구현 문제를 했다. 조금 더 낮은 난이도로!
unordered_map에 각 스킬과 순서를 저장해 주었고 BOOL배열로 스킬을 배웠는지 여부를 저장하였다.
skill_trees에서 스킬을 하나씩 확인하면서 해당 스킬이 주어진 스킬에 포함되어 있는지 확인하고 해당 스킬의 선행 스킬을 모두 배웠는지 BOOL배열을 통해 확인해 주었다. 만약 선행 스킬을 배우지 않았다면 Check = false로 해주었고 모든 스킬을 다 돌고 나서 순서대로 스킬을 배웠다면 answer++을 해주었다.

#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
using namespace std;
int solution(string skill, vector<string> skill_trees){
int answer = 0;
// 각 스킬의 인덱스를 저장할 unordered_map을 생성
unordered_map<char,int> m;
for(int i=0;i<skill.length();i++){
// 각 스킬과 해당 스킬의 인덱스를 unordered_map에 삽입
m.insert({skill[i],i});
}
for(int i=0;i<skill_trees.size();i++){
// 스킬을 배웠는지 여부를 저장하는 배열을 생성
vector<bool> BOOL(skill.length());
// 해당 스킬트리가 가능한지 여부를 저장하는 변수를 생성
bool Check = true;
for(int j = 0;j<skill_trees[i].length();j++){
// 각 스킬트리에서 스킬을 하나씩 확인
char c = skill_trees[i][j];
// 해당 스킬이 주어진 스킬에 포함되어 있는지 확인
if(m.find(c)!=m.end()){
// 해당 스킬의 선행 스킬을 모두 배웠는지 확인
if(m[c] == 0){
BOOL[0] = true;
} else{
if(BOOL[m[c]-1] == true){
BOOL[m[c]] = true;
} else{
// 선행 스킬을 배우지 않았다면 해당 스킬트리는 불가능
Check = false;
break;
}
}
}
}
// 스킬트리가 가능하다면 answer을 증가
if(Check) answer++;
}
return answer;
}
와 하나도 기억이안남