[Programmers][Py] 카드 뭉치

mj·2024년 8월 22일
0

코딩테스트문제

목록 보기
44/50
post-custom-banner

✅ 문제

문제 바로가기



✅ 나의 풀이

[실수] 첫번째 시도: IndexError

IndexError: pop from an empty deque
  • 에러 원인
    cards1cards2의 모든 단어들을 꺼내 빈 큐가 되었음에도 popleft()해서 오류가 났다.
  • 에러 해결
    cards1cards2가 비어있지 않은지 확인한 후 꺼내도록 바꾸어야 한다.
# IndexError: pop from an empty deque
def solution(cards1, cards2, goal):
    cards1 = deque(cards1)
    cards2 = deque(cards2)
    
    pop1 = cards1.popleft()
    pop2 = cards2.popleft()
    
    for card in goal:
        if pop1 == card:
            pop1 = cards1.popleft()
        elif pop2 == card:
            pop2 = cards2.popleft()
        else:
            return "No"
        
    return "Yes"



📍 나의 코드

from collections import deque

def solution(cards1, cards2, goal):
    cards1 = deque(cards1)
    cards2 = deque(cards2)
    
    pop1 = cards1.popleft()
    pop2 = cards2.popleft()
    
    for card in goal:
        if pop1 == card:
            if cards1: pop1 = cards1.popleft()

        elif pop2 == card:
            if cards2: pop2 = cards2.popleft()
            
        else:
            return "No"
        
    return "Yes"

풀이 과정

카드뭉치에서 순서대로 한 장씩 사용하므로 를 떠올렸다.
두 개의 카드뭉치에서 가장 앞에 있는 단어를 꺼내 goal의 단어와 같은지 순서대로 확인한다.



📍 더 나은 코드

큐 안의 단어들을 popleft()로 꺼내 확인할 필요없이
인덱싱으로 값을 먼저 확인한후에 popleft()로 꺼내 제거한다.

from collections import deque

def solution(cards1, cards2, goal):
    cards1 = deque(cards1)
    cards2 = deque(cards2)

    for card in goal:
        if cards1 and cards1[0] == card:
            cards1.popleft()

        elif cards2 and cards2[0] == card:
            cards2.popleft()
            
        else:
            return "No"
        
    return "Yes"



✅ 다른 풀이방법

📍 pop()

cards[0]으로 첫번째 값을 확인한 후, 인덱스0의 값 제거하기 cards.pop(0)

def solution(cards1, cards2, goal):
    for card in goal:
        if len(cards1) > 0 and card == cards1[0]:
            cards1.pop(0)       
        elif len(cards2) >0 and card == cards2[0]:
            cards2.pop(0)
        else:
            return "No"
    return "Yes"

📍 인덱스

두 카드 배열은 바뀌지 않고, 비교할 단어의 인덱스를 변수로 담아 포인터처럼 사용한다.

idx1idx2cards1cards2 리스트에서 현재 검사 중인 단어의 위치를 나타낸다.

def solution3(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"
profile
일단 할 수 있는걸 하자.
post-custom-banner

0개의 댓글