본문 바로가기
Programming/Python

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

by 용스토리랜드 2024. 7. 17.

♣ 문제 설명 

cards1 과 cards2 를 순서대로 한 장씩 사용하여 (리스트 안의 단어 순서는 바꿀 수 없음) goal list 처럼 만들 수 있으면 "Yes" Return, 아니면 "No" 리턴하는 문제

 


♣ 시도했던 코드 1 (오답, runtime error)

▶ 풀이 방법 : goal 의 요소 값들을 key로 가지며 index 를 value 로 하는 dic (딕셔너리) 를 생성하여 cards1 과 cards2 를 index 를 요소로 가지는 리스트를 생성하고, cards2 요소의 goal 에서의 index (cards2_idx) 와 cards2 를 cards1 에 더해줬을 때, goal 가 일치하면 "Yes" 아니면 "No" 를 return 하는 식으로 코드를 작성했다. 하지만, runtime 에서 에러가 나는 것을 알 수 있었다. 아무래도 for 문이 문제에서 요구하는 것 보다 많이 사용돼서 계산량이 많아서 그런 것 같다고 생각했다.

def solution(cards1, cards2, goal):
    dic = {}
    for (v, k) in enumerate(goal) : 
        dic[k] = v

    cards1_idx = [dic[c] for c in cards1]
    cards2_idx = [dic[c] for c in cards2]

    for idx, card in zip(cards2_idx, cards2) : 
        cards1.insert(idx, card)

    if cards1 == goal : 
        return 'Yes'
    else : 
        return 'No'

 

♣ 시도했던 코드 2 (오답, runtime error)

▶ 풀이 방법

위와 비슷한 방법인데, cards1 와 cards2 가 goal 를 만들 수 있다면 goal 의 요소 index 를 cards1과 cards2 에 적용해 인덱스 값을 가지는 리스트를 만들어줬을 때, 리스트를 정렬한 값과 정렬전 값이 (오름차순) 같을 것이라고 생각해서 수행

위와 동일하게 return 은 옳게 나오나 계산량에서 에러가 나는 것을 확인.

def solution(cards1, cards2, goal):
    dic = {}
    for (v, k) in enumerate(goal) : 
        dic[k] = v

    cards1_idx = [dic[c] for c in cards1]
    cards2_idx = [dic[c] for c in cards2]

    if (cards1_idx == sorted(cards1_idx)) and (cards2_idx == sorted(cards2_idx)) : 
        return 'Yes'
    else :
        return "No"

♣ 정답 코드

▶ 풀이 방법

각 카드 덱에서 goal의 순서대로 카드를 제거할 수 있는지 확인하고, 만약 불가능하다면 'No'를 반환

만약, 순서대로 제거하지 못한다면 goal 에서 뽑은 요소가 cards1 과 cards2 의 첫 번째 요소에서 일치하는 것이 없다면 순서대로 만들 수 없는 것으로 판단할 수 있기 때문에 return No 를 진행 

* 여기서 if cards1 and ~ 를 해준 것은 빈 리스트는 [] false, 비어있지 않다면 True 를 반환하는 자료형 Bool 의 특성을 활용해서 모두 비워내기 전까지만 수행하기 위함. !

def solution(cards1, cards2, goal) : 
    first_idx = 0

    for g in goal : 
        if cards1 and g == cards1[first_idx] : 
            cards1.pop(first_idx)
        elif cards2 and g == cards2[first_idx] : 
            cards2.pop(first_idx)
        else : return 'No'
    return 'Yes'
반응형