https://programmers.co.kr/learn/courses/30/lessons/49993
function solution(skill, skill_trees) {
var answer = 0;
var skillArr = skill.split('');
skill_trees.map(x => {
var isIncludesAny = false;
for (let i = 0; i < skillArr.length; i++) {
var isIncludes = x.indexOf(skillArr[i]);
if (isIncludes !== -1) {
isIncludesAny = true;
if (i === 0) {
continue;
} else {
var isIncludesPreskill = x.indexOf(skillArr[i - 1]);
if (isIncludesPreskill === -1) {
return;
}
if (isIncludesPreskill > isIncludes) {
return;
}
}
}
}
if (isIncludesAny === false) {
answer++;
return
}
answer++;
})
return answer;
}
let skill = "CBDK";
let skill_trees = ["CB", "CXYB", "BD", "AECD", "ABC", "AEX", "CDB", "CBKD", "IJCB", "LMDK"];
console.log(solution(skill, skill_trees));
answer++ 되는 조건을 이야기해보자
1. 스킬요소에 아얘 없는 스킬요소들만 있는 스킬트리인 경우
2. 스킬요소에 있으나 스킬의 가장 앞 요소가 있으며 순서대로 배운 경우, 다만 스킬요소에 없는 스킬은 상관하지 않는다.
접근을 방식은 스킬트리에 있는 스킬을 하나씩 꺼내서 조건에 부합한지 체크한다.
스킬트리의 요소를 x라고 하자 x에 스킬요소가 있는지 확인한다.
includesAny를 true로 변환 : 조건 1을 확인만약 스킬요소의 가장 앞부분이 있다면 다음 스킬확인
다시 두번째부터 스킬요소가 있는지 확인할 때는 선행스킬이 있는지 확인한다.
모두 통과된 것들은 조건을 모두 만족한 것이므로 answer++;
배열의 복사는 참조 복사를 하지말고 깊은 복사를 위해서 slice()복사 혹은 var arrCopy = JSON.parse(JSON.stringify(arr))
배열의 비교또한 위와 같이 JSON.stringify(arr) === JSON.stringify(arr2) 한다. 단점은 객체를 JSON형태로 바꾸는 것이기에 getter, setter가 있는 객체를 주의한다.
map()함수는 배열을 차례대로 훑기 때문에 break나 continue같은 for문에서 돌아가는 명령문은 통하지 않는다. 대신 return 같은 것을 쓰자.