본문 바로가기

알고리즘/test

javascript) 프로그래머스 - 카드 뭉치

https://school.programmers.co.kr/learn/courses/30/lessons/159994

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

실행코드

function solution(cards1, cards2, goal) {
    const end = goal.length;
    for(let i = 0; i < end;i++){
        if(cards1[0] === goal[0]){
            cards1.shift();
            goal.shift();
        }else if(cards2[0] === goal[0]){
            cards2.shift();
            goal.shift();
        }else {
            return "No"
        }
    }
    return "Yes";
}

풀이

먼저 goal의 길이가 for문을 순회할 때 마다 유동적으로 변하기 때문에 goal의 길이를 담는 end를 선언 해 주었습니다.

for문을 돌아 만약 cards1 , cards2의 첫번째가 goal의 첫번째 요소와 같으면 그 해당 요소를 shift해줍니다 만약 해줄수없을 시 조건에 맞기 않기 때문에 No를 return 쭉돌아서 전부 조건에 맞으면 Yes를 return 해 주었습니다.

 

개선된풀이

function solution(cards1, cards2, goal) {
    if (!Array.isArray(cards1) || cards1.length === 0 ||
        !Array.isArray(cards2) || cards2.length === 0 ||
        !Array.isArray(goal) || goal.length === 0) {
        return "Invalid input";
    }
    if (goal.length === 0) {
        return "Yes";
    }
    const goalLength = goal.length;
    let index1 = 0;
    let index2 = 0;
    for (let i = 0; i < goalLength; i++) {
        if (cards1[index1] === goal[i]) {
            index1++;
        } else if (cards2[index2] === goal[i]) {
            index2++;
        } else {
            return "No";
        }
    }
    return "Yes";
}

1. 매개변수 유효성 검사를 해줍니다.

2. 초기종료: 'goal'이 빈 배열인 경우 함수는 "Yes"를 반환해줍니다.

3 성능 개선: 이 함수는 루프의 각 반복에서 cards1, cards2 및 goal 배열의 시작 부분에서 요소를 이동합니다. 대형 어레이의 성능 병목 현상. splice 메소드를 사용하여 제거할 요소의 인덱스를 추적하고 한 번에 제거함으로써 성능을 향상시킬 수 있습니다.