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
같은 것을 쓰자.