[프로그래머스/C++]Lv.2 - 스킬트리

YH J·2023년 10월 13일
0

프로그래머스

목록 보기
168/168

문제 링크

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을 첫 원소부터 같은지 검사한다.

profile
게임 개발자 지망생

0개의 댓글