알고리즘 문제/C++

[프로그래머스] Level2 : 스킬트리 - C++

lingk 2020. 7. 10. 15:47
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int solution(string skill, vector<string> skill_trees) {
    int answer = 0;
    for(int i=0;i<skill_trees.size();i++){
        for(int j=0;j<skill_trees[i].size();j++)
            if(find(skill.begin(),skill.end(),skill_trees[i][j])==skill.end()){
                skill_trees[i].erase(find(skill_trees[i].begin(),skill_trees[i].end(),skill_trees[i][j]));
                j--;
            }
        int check=0;
        for(int j=0;j<skill_trees[i].size();j++)
            if(skill[j]!=skill_trees[i][j]){
                check=1;break;
            }
        if(check==0)
            answer++;
    }
    return answer;
}

skill_trees에서 각각의 원소별로 skill에 담긴 문자가 아니라면 erase함수를 통해서 제거해준다.

이때 주의할점(배운점)은 erase함수로 제거하면 그 뒤에 있는 원소들을 남은 자리만큼 앞으로 이동시키기 때문에 모든 문자를 비교하기 위해서는 j를 -1해주어야 한다.

skill에 포함되지 않은 문자를 삭제시키고 난 후에 skill_trees에 남은 문자와 skill을 비교해주었을 때 같은 인덱스에 같은 문자가 들어있지 않다면 선행관계가 깨진 것이기 때문에 answer을 증가시켜주지 않는다. 이때 for반복문은 skill이 아닌 skill_trees의 사이즈 범위로 해주어야 skill_trees의 문자개수가 skill보다 적은 경우도 확인할 수 있다.

반응형