// 1
배열 res : 유저스킬배열 중 선행스킬순서에 해당하는 스킬만 넣을 배열을 생성한다
// 2
유저스킬배열을 map 이중순회하면서(일종의 skill_trees[i][j])
+-- 유저의 스킬들이 선행스킬에 해당하고(skill.includes(v[j])) &&
+-- 선행스킬의 순서에 맞는지 판단하기 위해 선행스킬의 indx보다 크거나 같은 값만 res[i]에 들어갈 수 있게 조건을 건다. (res[i]에 들어가지 못한다는 건 순서가 맞지 않다는 의미를 갖는다)
+-- 이때 동시에 선행스킬에 해당하는 스킬 개수도 세어준다(cnt)
// 3
마지막에 선행스킬에 해당하는 개수와 순서에 맞는 스킬 개수를 비교해서 이게 같아야 순서에 맞게 스킬을 배웠다는 의미를 갖는다.
function solution(skill, skill_trees) {
skill=skill.split('');
let answer = 0;
let res = new Array(skill_trees.length).fill('');
skill_trees.map((v,i) => {
let cnt=0;
[...v].map((_,j) => {
if (skill.includes(v[j]) && res[i].length >= skill.indexOf(v[j])) {
res[i] += v[j]
cnt++;
} else if (skill.includes(v[j])) {
cnt++;
}
});
if (cnt === res[i].length) answer++;
})
return answer;
}
console.log(solution("CBD", ["BACDE", "CBADF", "AECB", "BDA"]));
// new RegExp(pattern, flags?) Javascript 와 RegExp 정규 표현식
// []
안에 ^
가 들어가 있으므로 skill 이외 문자 대응
console.log(skill_trees.map((x) => x.replace(regex, '')));
// indexOf
를 문자열에서 사용할 때 값이 있으면 첫번째 요소의 index만 반환한다.
console.log(skill_trees.map((x) => x.replace(regex, '')).filter((x) => skill.indexOf(x) === 0 || x === ""));
function solution(skill, skill_trees) {
var answer = 0;
var regex = new RegExp(`[^${skill}]`, 'g');
return skill_trees
.map((x) => x.replace(regex, ''))
.filter((x) => {
return skill.indexOf(x) === 0 || x === "";
})
.length
}
console.log(solution("CBD", ["BACDE", "CBADF", "AECB", "BDA"]));
filter에 함수를 바로 넘겨줌으로써 인자로 문자열을 받도록 한다.
function solution(skill, skill_trees) {
function isCorrect(n) {
// const test = '[' + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('').filter(v => !skill.includes(v)).join('') + ']*';
let test = skill.split('');
for (var i = 0; i < n.length; i++) {
if (!skill.includes(n[i])) continue; // 각 문자가 스킬에 존재하는지 판단 (존재하지 않으면 continue)
if (n[i] === test.shift()) continue; // 존재한다면 그 문자가 스킬의 첫문자인지 판단 (첫 문자면 continue, 첫문자가 아니면 false)
return false;
}
return true;
}
return skill_trees.filter(isCorrect).length;
}
console.log(solution("CBD", ["BACDE", "CBADF", "AECB", "BDA"]));