#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보다 적은 경우도 확인할 수 있다.
반응형
'알고리즘 문제 > C++' 카테고리의 다른 글
[백준] 9012번 : 괄호 - C++ (0) | 2020.12.17 |
---|---|
[프로그래머스] Level2 : 최댓값과 최솟값 - C++ (0) | 2020.07.10 |
[프로그래머스] Level2 : [1차] 뉴스 클러스터링 - C++ (0) | 2020.07.06 |
[프로그래머스] Level1 : [1차]다트 게임 - C++ (0) | 2020.07.06 |
[프로그래머스] Level1 : 키패드 누르기 - C++ (0) | 2020.07.03 |