프로그래머스 카드 뭉치

0

알고리즘

목록 보기
7/8
post-thumbnail

혹시나 잘못된 개념 전달이 있다면 댓글 부탁드립니다. 저의 성장의 도움이 됩니다.

문제 설명

코니는 영어 단어가 적힌 카드 뭉치 두 개를 선물로 받았습니다. 코니는 다음과 같은 규칙으로 카드에 적힌 단어들을 사용해 원하는 순서의 단어 배열을 만들 수 있는지 알고 싶습니다.

원하는 카드 뭉치에서 카드를 순서대로 한 장씩 사용합니다.
한 번 사용한 카드는 다시 사용할 수 없습니다.
카드를 사용하지 않고 다음 카드로 넘어갈 수 없습니다.
기존에 주어진 카드 뭉치의 단어 순서는 바꿀 수 없습니다.
예를 들어 첫 번째 카드 뭉치에 순서대로 ["i", "drink", "water"], 두 번째 카드 뭉치에 순서대로 ["want", "to"]가 적혀있을 때 ["i", "want", "to", "drink", "water"] 순서의 단어 배열을 만들려고 한다면 첫 번째 카드 뭉치에서 "i"를 사용한 후 두 번째 카드 뭉치에서 "want"와 "to"를 사용하고 첫 번째 카드뭉치에 "drink"와 "water"를 차례대로 사용하면 원하는 순서의 단어 배열을 만들 수 있습니다.

문자열로 이루어진 배열 cards1, cards2와 원하는 단어 배열 goal이 매개변수로 주어질 때, cards1과 cards2에 적힌 단어들로 goal를 만들 있다면 "Yes"를, 만들 수 없다면 "No"를 return하는 solution 함수를 완성해주세요.

바로가기



풀이한 코드

  • 배열을 뒤집어서 마지막 요소와 일치하면 제거
    -> 시간 복잡도 O(n)
    c.f. 배열의 첫번째 요소와 비교하여 shift 메서드를 사용한다면 전체 복잡도는 O(n^2)

ver1 : for문 사용

function solution(cards1, cards2, goal) {
    const loopCount = goal.length;
    
    cards1.reverse();
    cards2.reverse();
    
    for(let i = 0; i < loopCount; i++){
        const el = goal[i];
        
        if(cards1.at(-1) === el){
            cards1.pop();
        } else if( cards2.at(-1) === el){
            cards2.pop();
        } else {
            return "No"
            // for문에서는 최초 "No" 를 반환하면 함수가 종료
        }
    }
    
    return "Yes"
}

ver2 : forEach 메서드 사용

function solution(cards1, cards2, goal) {
    let result = "Yes";
    
    cards1.reverse();
    cards2.reverse();
    
    goal.forEach((el,idx)=>{
        if(cards1.at(-1) === el){
            cards1.pop();
        } else if( cards2.at(-1) === el){
            cards2.pop();
        } else {
            result = "No";
          	// 고차함수의 콜백함수에서는 return "No" 를 해도 solution함수의 반환값이 "No"가 되지 않는다.
            // for문에서 continue와 같이 처리되므로 변수에 재할당 하는 방식으로 풀이했다. 
        }
    });
        
    return result;
}


TIL

for문과 고차함수를 사용하는것의 차이가 궁금해서 2번 제출했는데, ver2는 속도가 미세하게 느리지만 메모리가 더 적다. 결국 비슷하니 빨리 끝내고 하나 더 푸는게 나을것 같다. shift 로 풀이해도 테스트케이스에서는 시간과 메모리가 비슷하게 표현되긴한다.
하지만, O(n)과 O(n^2)의 비교에서는 O(n)이 유리할 것이다.

0개의 댓글