[프로그래머스 | Javascript] 카드 뭉치

박기영·2023년 2월 21일
1

프로그래머스

목록 보기
121/126

solution

function checkCards (cards, goal) {
    const cardsFilteredByGoal = goal.filter((item, index) => cards.includes(item));
    
    const cardFilteredByIndex = cardsFilteredByGoal.filter((item, index) => item === cards[index]);
    
    if(cardFilteredByIndex.length !== cardsFilteredByGoal.length){
        return false;
    }
    
    return true;
}

function solution(cards1, cards2, goal) {    
    if(checkCards(cards1, goal) && checkCards(cards2, goal)){
        return "Yes";
    }
    
    return "No";
}

필자는 함수를 만들어서 풀었다. 함수를 설명하자면 다음과 같다.

목표 문장에서 하나의 카드(ex. cards1)에 들어있는 애들만 쭉 뽑아낸다.
이는 문제 조건에 cards1, cards2가 다른 단어로만 이루어져있다고 명시되어 있기 때문에 가능하다.

뽑아낸 배열에서 해야할 것은 순서를 보는 것이다.
단순 포함이 아니라, 순서까지 똑같은 상태로 포함이 되어 있어야 정답이기 때문이다.
따라서, 뽑아낸 배열에서 filter()를 사용하여 대상 카드(ex. cards1)의 값들과 인덱스까지 일치하는지 판별한다.

만약, 모든 조건을 만족했다면 위에서 처리한 두 배열의 길이가 같을 것이다.
다르다면 대상 카드(ex. cards1)는 정답이 될 수 없으므로 false, 같다면 정답이므로 true를 반환한다.

이를 cards1, cards2에 대해 각각 진행해준다.
두 카드가 모두 정답이 되는 경우에만 문제를 통과할 수 있으므로, Yes를 반환하고,
하나라도 정답이 아닌 경우라면 문제를 통과할 수 없으므로, No를 반환한다.

다른 분 풀이

function solution(cards1, cards2, goal) {

    for(const s of goal) {

        if(cards1[0] == s) {
            cards1.shift();
        } else if(cards2[0] == s) {
            cards2.shift();
        } else {
            return "No"
        }
    }

    return "Yes";
}

다른 분들은 정말 코드가 간단했다.
goal에 있는 문자열을 하나씩 판별하는 방법으로,
cards1에 해당하는 문자라면 cards1에서 제거하고, cards2에 해당하는 문자라면 cards2에서 제거한다.
만약, 그 어느 쪽에도 해당하지 않는다면 이는 없는 단어거나, 순서가 맞지 않는 단어이므로 No.
이 모든 과정을 통과하면 순서까지 만족하는 경우이므로 Yes.

profile
나를 믿는 사람들을, 실망시키지 않도록

0개의 댓글