728x90
스킬트리
문제 설명
정해진 스킬 순서를 올바르게 배웠는지 체크하는 문제.
스킬을 의미하는 알파벳 사용 여부와 skill
의 순서로 skill_trees
들을 체크한다.
문제 풀이
소스코드 : C++
skill
에 있는 스킬들을true
표시 해둔다.skill_trees
에 담긴 스킬들을 탐색한다.- 해당 스킬이
skill
에 포함 된 문자라라면 순서가 맞는지 체크한다. - 순서를 의미하는
index
,skill[index] == s[j]
이면 다음 스킬을 체크한다. - 그렇지 않으면 순서가 맞지 않으므로
break
- 위과정을 반복하여 스킬의 모든 길이를 탐색했으면 예외가 없으므로
answer++
해준다. - 위 과정을 반복한다.
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int solution(string skill, vector<string> skill_trees) {
int answer = 0;
vector<bool> check(26);
for (int i = 0; i < skill.length(); i++)
check[skill[i] - 65] = true;
for (int i = 0; i < skill_trees.size(); i++) {
int index = 0;
int j;
string s = skill_trees[i];
for (j = 0; j < s.length(); j++) {
if (check[s[j] - 65]) {
if (skill[index] == s[j]) index++;
else break;
}
}
if (j == skill_trees[i].length())
answer++;
}
return answer;
}
소스코드 : Python
좀 쉬운방법이 없을까 하다가 다른 풀이를 참고했다. 덕분에 for else문을 알게되었다.
c++ 코드에서 23번째 줄
if (j == skill_trees[i].length())
answer++;
이 코드와 같다고 보면된다.
- 탐색해야할
skills
의 원소가skill
안에 있으면 배워야할 순서인skill_list
의 맨 앞의 원소와 비교한다. - 비교한 두 문자가 만약 다르면
break
를 걸어준다. - 같으면 끝까지 탐색한다.
- 끝까지 탐색했다면
answer +=1
을 해준다.
def solution(skill, skill_trees):
answer = 0
for skills in skill_trees:
skill_list = list(skill)
for s in skills:
if s in skill:
if s != skill_list.pop(0):
break
else:
answer += 1
return answer
728x90
300x250