문제 링크

해결 과정

전체 코드

def check_available(remain_cards: dict, picked_cards: dict, target_num: int):
    for num in remain_cards.keys():
        if target_num-num in remain_cards:    # 동전을 안써도 되는 경우
            return ('no_coin', [num, target_num-num])
    
    for num in remain_cards.keys():
        if target_num-num in picked_cards:    # 동전 한 개를 사용해야 하는 경우
            return ('one_coin', [num, target_num-num])
    
    for num in picked_cards.keys():
        if target_num-num in picked_cards:    # 동전 두 개를 사용해야 하는 경우
            return ('two_coins', [num, target_num-num])
        
    return ('unavailable', None)

def solution(coin, cards):
    answer = 1
    current = int(len(cards) // 3)   # 현재 위치
    target_num = len(cards) + 1      # 타겟 숫자
    remain_coins = coin              # 현재 가지고 있는 동전 갯수
    remain_cards = {num: 'ok' for num in cards[:current]}   # 현재 가지고 있는 카드 목록
    picked_cards = dict()            # 현재까지 뽑은 카드 목록
    
    while remain_cards and current < len(cards)-1:  # 현재 카드를 가지고 있다면, 반복문 수행
        for num in cards[current:current+2]:        # 매 라운드마다 카드 두 장 뽑기
            picked_cards[num] = 'ok'
            
        flag, nums = check_available(remain_cards, picked_cards, target_num)
        
        if flag == 'no_coin':   # 동전을 안써도 되는 경우
            for num in nums:    # 원래 가지고 있던 카드를 제거
                del remain_cards[num]
            current += 2
            answer += 1
        elif flag == 'one_coin':   # 동전 한 개를 사용해야 하는 경우
            if remain_coins >= 1:  # 낼 수 있는 동전이 있는 경우
                del remain_cards[nums[0]]
                del picked_cards[nums[1]]
                remain_coins -= 1
                current += 2
                answer += 1
            else:   break          # 낼 수 있는 동전이 없는 경우
        elif flag == 'two_coins':  # 동전 두 개를 사용해야 하는 경우
            if remain_coins >= 2:
                for num in nums:   # 새로 뽑은 카드 목록에서 제거
                    del picked_cards[num]
                remain_coins -= 2
                current += 2
                answer += 1
            else:   break          # 낼 수 있는 동전이 없는 경우
        else:   # 다음 라운드를 갈 수 없는 경우
            break
            
    return answer

유사 문제

제가 생각했을 때, 해당 그리디 알고리즘과 비슷한 문제는 아래와 같습니다.