본문 바로가기
Problem Solving/프로그래머스

[프로그래머스 | 파이썬 / 자바스크립트] 카드 뭉치(연습문제/ level 1)

by 청량리 물냉면 2023. 2. 23.
반응형
문제

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

 

프로그래머스

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

programmers.co.kr

 

 

🐍파이썬
from collections import deque 
def solution(cards1, cards2, goal):
    q1 = deque(cards1)
    q2 = deque(cards2)
    for i in range(len(goal)):
        if q1 and q1[0] == goal[i]:
            q1.popleft()
        elif q2 and q2[0] == goal[i]:
            q2.popleft()
        else:
            return "No"
    return "Yes"

1️⃣ popleft()를 사용하기 위해 deque를 import하여 사용했다.

2️⃣ q1과 q2의 0번째 인덱스에 goal에 해당하는 글자가 존재하면 leftpop()하여 해당 문자를 제거했다.

3️⃣ 만약 두 deque의 0번째 인덱스에 goal의 글자가 없다면 원하는 단어배열을 완성할 수 없다는 뜻이므로 바로 "No"를 리턴한다.

4️⃣ goal의 반복문을 모두 돌았다면 단어배열을 완성했다는 뜻이므로 "Yes"를 리턴한다.

 

 

다른 풀이 방법

def solution(cards1, cards2, goal):
    idx1,idx2=0,0
    for word in goal:
        if len(cards1)>idx1 and cards1[idx1]==word:
            idx1+=1
        elif len(cards2)>idx2 and cards2[idx2]==word:
            idx2+=1
        else:
            return "No"
    return "Yes"

cards의 인덱스를 증가시켜주는 것으로 popleft()를 대신했다.

 

 

🐥자바스크립트
function solution(cards1, cards2, goal) {
    for(let i of goal){
        if (cards1 && cards1[0] == i){
            cards1.shift()
        } else if(cards2 && cards2[0] == i){
            cards2.shift()
        } else {
            return "No";
        }
    }
    return "Yes";
}

위 파이썬 풀이에 사용했던 popleft() 대신 shift() 함수를 사용하여 배열의 첫번째 원소를 제거했다.

1️⃣ cards1과 cards2의 0번째 인덱스에 goal에 해당하는 글자가 존재하면 shift()하여 해당 문자를 제거

2️⃣ 만약 두 배열의 0번째 인덱스에 goal의 글자가 없다면 원하는 단어배열을 완성할 수 없다는 뜻이므로 바로 "No"를 리턴한다.

3️⃣ goal의 반복문을 모두 돌았다면 단어배열을 완성했다는 뜻이므로 "Yes"를 리턴한다.

 

 

다른 풀이 방법

function solution(cards1, cards2, goal) {
    for(let v of goal) {
        if(cards1.includes(v)){
            if(cards1.shift() !== v){
                return "No";
            }
        } else {
            if(cards2.shift() !== v){
                return "No";
            }
        }
    }
    return "Yes";
}

shift()로 리턴된 한글자씩 goal의 글자와 비교


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

 

 

 

 

 

 

반응형