오늘의 코딩 테스트 한줄 - 카드 뭉치

Edwin·2023년 6월 3일
0
post-thumbnail

오늘의 코딩 테스트 한줄 - 카드뭉치

  • 문제풀이 30분
  • 리팩토링 30분

결과적으로 최초의 코드의 처리속도 대비 0.03초 끌어올렸으며, 메모리 사용에 있어서도 0.3MB를 덜 사용하도록 처리하였다.

문제에서 발생된 이슈(카드 뭉치 20, 21, 24번)

이번 문제에서 발생된 이슈는 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]) 부분이 단지 매개변수만 다를 뿐 코드의 중복이 상당한 것을 볼 수 있다. 이를 하나의 함수로 정의하고 그 결과에 해당되는 정보를 삼항조건부 연산자로 가볍게 처리하도록 코드를 개편하였고, 그 결과 처리속도에서도 메모리 사용에 있어서도 가볍게 만들어낼 수 있었다.

profile
신학전공자의 개발자 도전기!!

0개의 댓글