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
제가 생각했을 때, 해당 그리디 알고리즘과 비슷한 문제는 아래와 같습니다.