string::find()

string 객체가 가진 메서드(함수) 중 find() 메서드는 인자로 넣은 데이터를 string 내에서 있는지 탐색하는 역할을 수행

만약 탐색이 성공할 경우 string::size_t의 형식으로(int형으로 변환 가능) 위치를 표시함

#include <string>

string s("Hello World!");

int a = s.find('e');  //a = 1;
string::size_t a = s.find('E'); //a = string::npos에 해당하는 값으로 업데이트

문제 조건

Untitled

Code Review

각 스킬 트리를 check_skill 함수를 통해 확인하고 정상적으로 동작할 경우 answer를 1 늘림

  1. before를 통해 마지막으로 사용했던 스킬 트리의 번호 저장 → -1로 초기화 한 이유 : skill의 처음부터 순차적으로 사용해야 하기 때문에 -1, 0 1, … 순으로 증가해야 함
  2. for문을 통해 모든 스킬을 순차적으로 확인하면서 다음 작업을 수행
    1. cur에서는 skill의 순서를 찾음(없을 경우 string::npos로 값이 설정됨)
    2. 찾으려는 값이 없는 경우 해당 스킬은 순서 관계가 필요 없음으로 다음 스킬을 확인함
    3. 만약 스킬의 순서가 before 다음이 아닐 경우 순서대로 찍히지 않은 것임으로 false를 반환
    4. 순서대로 찍힌 경우 before를 1 늘림
  3. 모든 skill_tree가 문제 없을 경우 true 반환
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

bool check_skill(string &skill, string &skill_tree){
    int before = -1;  //마지막으로 사용했던 스킬 트리의 번호 저장
    for(auto &i : skill_tree){ 
        auto cur = skill.find(i);  //스킬의 순서를 찾음
        if(cur == string::npos) continue;  //만약 해당 스킬을 skill에서 찾지 못한 경우 다음으로 넘김
        if(cur != before + 1) return false;  //먄약 스킬이 순서대로 찍히지 않은 경우 false 반환
        before++;  //마지막 사용 스킬트리 번호 업데이트
    }
    return true;
}

int solution(string skill, vector<string> skill_trees) {
    int answer = 0;
		//각 스킬트리를 학인하여 정상적일 경우 answer를 1 증가시킴
    for_each(skill_trees.begin(), skill_trees.end(), [&](string s){if(check_skill(skill, s)) answer++; });
    return answer;
}