결과적으로 최초의 코드의 처리속도 대비 0.03초 끌어올렸으며, 메모리 사용에 있어서도 0.3MB를 덜 사용하도록 처리하였다.
이번 문제에서 발생된 이슈는 card1, card2의 조합으로 만들어내는 goal이 반듯이 두 카드모두를 사용하지 않는다는 제한사항을 놓쳤기 때문에 발생되었다. 즉 card1, card2의 길이보다 goal가 작은 경우 발생되는 문제였다. 해당 이슈는 테스트 20, 21, 24번에서 발생되었다. 이 경우를 충족해야 되었다.
function solution(cards1, cards2, goal) {
let arr1 = goal.filter(el => cards1.includes(el)).map((el, index) => el === cards1[index])
let arr2 = goal.filter(el => cards2.includes(el)).map((el, index) => el === cards2[index])
return [...arr1, ...arr2].indexOf(false) === -1 ? "Yes" : "No"
}
접근은 이러하다.
01 - goal 배열에 있어서 cards에 포함되는 요소가 있는지를 살펴보고
02 - 새롭게 생성된 배열에서 해당 요소와 기존 cards의 인덱스가 같은지 점검을 한다.
03 - 최종적으로 생성된 배열에서 false가 없으면 "Yes"를, 존재하면 "No"를 출력한다.
function solution(cards1, cards2, goal) {
const isSubset = (cards, goal) => {
let answer = goal.filter(el => cards.includes(el))
.map((el, index) => el === cards[index])
.indexOf(false) === -1
return answer;
};
return isSubset(cards1, goal) && isSubset(cards2, goal) ? "Yes" : "No";
}
let arr1 = goal.filter(el => cards1.includes(el)).map((el, index) => el === cards1[index])
부분이 단지 매개변수만 다를 뿐 코드의 중복이 상당한 것을 볼 수 있다. 이를 하나의 함수로 정의하고 그 결과에 해당되는 정보를 삼항조건부 연산자로 가볍게 처리하도록 코드를 개편하였고, 그 결과 처리속도에서도 메모리 사용에 있어서도 가볍게 만들어낼 수 있었다.