단순하게 각 스킬트리의 순서를 하나씩 따지는 방식으로 풀이를 하고나서 다른 사람의 풀이를 보았는데 정규표현식으로 아주 깔끔하게 끝내버리는 것을 보고 충격받았다. 그래서 정규표현식을 이용해 푼 방식으로 다시 풀어보았다.
순서는 다음과 같다.
정규표현식을 이용해서 각 스킬트리에 존재하는 skill에 포함되지 않은 문자열을 모두 제거한다.
skill_trees.map(x => x.replace(new RegExp(`[^${skill}]`, 'g'), ''))
new RegExp
는 정규표현식을 생성자로 생성하는 것이다.[^str]
은 부정문자 셋으로 인덱스와 상관없이 str에 포함되지 않은 문자에 대응된다.'g'
는 두 번째 인자로 전역검색을 의미한다.올바른 스킬트리(skill)와 관련없는 스킬이 모두 제거된 스킬 트리들은 빈 문자열이거나 skill에 속한 문자만으로 이루어진 문자열이다.
모든 과정을 거친 후 길이를 구한다.
function solution(skill, skill_trees) {
return skill_trees
.map(x => x.replace(new RegExp(`[^${skill}]`, 'g'), ''))
.filter(x => skill.indexOf(x) === 0 || x === '')
.length;
}