본문 바로가기
Studieeeeee~./JS Algorism Test

[코테 합격자되기 Js] 문제 17 카드뭉치

by dev챙 2024. 8. 14.

프로그래머스 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/159994

문제 풀며 놓친 점

  • 자바스크립트의 Object나 Array와 같은 iterator들은 값이 같은지 비교할 때 메모리 주소로 비교한다.
  • 배열, 객체를 비교할 때는 비교하려는 대상은 JSON.stringify(array) 메서드를 이용해 문자열로 변환한 후 비교할 수 있다.

잘 못 이해한 부분

  • 카드1과 카드2에서 각각 카드가 한장씩 뽑아 goal 배열과 맞는 순서로 나열하여 비교하는 문제인지 알았는데, 카드1과 카드2를 무조건 둘다 뽑아서 비교하는 문제가 아니라 하나만 뽑아서 비교하면 되는 문제였다. 문제를 잘 읽도록 하자.

[오답]처음 문제를 푼 방법

처음에 문제 이해를 잘 못해서 전부 두개씩 비교하여 함수를 작성했다. goal 배열의 요소가 홀수인 경우에 마지막 goal의 요소가 지워지지않고 그대로 남아있어. 예외처리를 하지 못하는 경우가 발생하였다. 다시 함수를 고민하며 문제를 읽어보던 중 잘못 이해한 것을 깨달았다. 문제를 다시 이해하고 두개씩 비교하던 함수를 하나씩 비교하는 함수로 변경하였다.


function solution(cards1, cards2, goal) {
    let answer = '';

    const words = [];

    for (i=0; i< goal.length; i++){
        const target = JSON.stringify([goal[0],goal[1]])
        console.log(target);

        if(JSON.stringify([cards1[i],cards2[i]]) === target){
            words.push(cards1[i],cards2[i]);
            goal.shift()
            goal.shift()

        } else if(JSON.stringify([cards2[i], cards1[i]]) === target) {
            words.push(cards2[i],cards1[i]);
            goal.shift()
            goal.shift()

        } else if(goal.length !==0 ) {

         return answer = "No";
        }

    }

    console.log(goal);
  if (goal.length === 0) return answer="Yes"

    return answer;
}

[정답]수정된 함수 풀이


function solution(cards1, cards2, goal) {
   const n = goal.length;

    for(let i=0; i<= n; i++){

        if(goal[0] === cards1[0]){
            goal.shift();
            cards1.shift();
        }

        else if(goal[0] === cards2[0]){
            goal.shift();
            cards2.shift();
        }
    }

 return (goal.length === 0) ? "Yes" : "No";

}

큐 구현해서 문제 풀기


class Queue {
    items = [];
    first = 0;
    rear = 0;

    constructor (array) {
        this.items= array;
        this.rear = array.length;
    }

    push (item) {
        this.items.push(item);
        this.rear++;
    }

    pop () {
        return this.items[this.first++];

    }

    front(){
        return this.items[this.first];
    }

    isEmpty () {
        return this.first === this.rear;
    }
}


function solution(cards1, cards2, goal) {
    cards1 = new Queue(cards1);
    cards2 = new Queue(cards2);
    goal = new Queue(goal);

    while (!goal.isEmpty()){
        if(!cards1.isEmpty() && cards1.front() === goal.front()) {
            cards1.pop();
            goal.pop();
        } else if(!cards2.isEmpty() && cards2.front() === goal.front()) {
            cards2.pop();
            goal.pop();
        } else {
            break;
        }
    }

    return goal.isEmpty() ? "Yes": "No";

}

정답 코드 비교

class로 Queue를 구현해서 그런지 확실히 큐로 구현한 정답코드가 3배정도 느렸다. 하지만 이번 문제로 자바스크립트로 큐를 구현하는 방법과 어떻게 실행되는지에 대한 이해가 확실히 된 것 같다. 단순한 문제일 경우에는 이렇게 다른 방법으로 풀 수 있지만 테스트 코드가 더 늘어난다면 큐로 풀이하는게 더 안정적으로 테스트를 통과할 수 있을 거 같다.

'Studieeeeee~. > JS Algorism Test' 카테고리의 다른 글

js 알고리즘 테스트 환경 VS code로 세팅하기  (0) 2024.08.22
[코테 합격자되기 Js] 문제 16 기능 개발  (0) 2024.08.14
  (0) 2024.08.13
이진 트리 binary tree  (0) 2024.08.13
해시 개념 정리  (0) 2024.08.13