본문 바로가기
알고리즘/프로그래머스

[C++] 스킬트리

by parkkingcar 2023. 7. 6.

 

스킬트리

선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다. 

예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다. 위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 

따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다. 

선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.

 

 

 

입출력 예

"CBD" ["BACDE", "CBADF", "AECB", "BDA"] 2

 

 

 

skill_trees배열에 있는 스킬트리를 하나씩 확인해야 합니다. find 배열을 만들어 스킬트리 배열에 있는 문자열을 한 글자씩 확인하여 입력받은 skill 문자열에 알파벳이 있다면 find 배열에 삽입합니다. 만든 find 배열 안에 값들을 확인하여 skill 문자열의 각 위치의 알파벳과 확인합니다. 일치하지 않는 알파벳이 없다면, answer + 1을 합니다.

 

 

 

 

풀이

#include <string>
#include <vector>

using namespace std;

int solution(string skill, vector<string> skill_trees) {
    int answer = 0;
    for(int i = 0; i < skill_trees.size(); i++){
        vector<char> find;
        bool check = true;
        for(int j = 0; j < skill_trees[i].size(); j++){
            if(skill.find(skill_trees[i][j]) != string::npos){
                find.push_back(skill_trees[i][j]);
            }
        }
        for(int i = 0; i < find.size(); i++){
            if(skill[i] != find[i]) check = false;
        }
        if (check) answer++;
    }
    return answer;
}

'알고리즘 > 프로그래머스' 카테고리의 다른 글

[C++] (스택) 기능개발  (0) 2023.07.12
[C++] (DP) 점프와 순간이동  (0) 2023.07.10
[C++] 방문 길이  (0) 2023.06.30
[C++] (map) 할인 행사  (0) 2023.06.29
[C++] (원순열) 연속 부분 수열 합의 개수  (0) 2023.06.22

댓글