본문 바로가기
코딩 테스트/Python_백준

[백준/Python] 2798번 블랙잭 문제

by 모두의 케빈 2023. 5. 2.

■ 2798번 블랙잭 문제

 

출처: 백준 2798번 블랙잭 문제

 

■ 코드 풀이

 

저는 이 문제를 itertools 라이브러리를 활용하여 풀었습니다. itertools는 여러 반복적인 작업을 하는 경우에 굉장히 유용하게 활용할 수 있는 라이브러리입니다. 상세 설명은 아래 링크를 확인해 주세요.

 

https://docs.python.org/ko/3.8/library/itertools.html

 

itertools — 효율적인 루핑을 위한 이터레이터를 만드는 함수 — Python 3.8.16 문서

itertools — 효율적인 루핑을 위한 이터레이터를 만드는 함수 이 모듈은 APL, Haskell 및 SML의 구성물들에서 영감을 얻은 여러 이터레이터 빌딩 블록을 구현합니다. 각각을 파이썬에 적합한 형태로

docs.python.org

 

itertools 라이브러리에는 combination이라는 메서드가 있습니다. 이 메서드는 반복 가능한 객체에서 r개의 조합을 반환해 줍니다. 아래 코드를 살펴보겠습니다. 우선 숫자들의 list를 num_list에 받고 target 숫자를 M이라고 선언합니다.

그리고 N개의 idx_list를 만듭니다. 그리고 combination 메서드에 idx_list와 3을 인자로 넣어주면, idx_list에서 가능한 모든 조합이 반환됩니다. 예컨대 (0,1,2), (0,1,3),... (1,2,3), (1,2,4),... 등이 반환되는 셈입니다. 이 메서드를 활용하면 모든 조합의 경우의 수를 고려할 수 있습니다.

이렇게 index 조합을 활용하여 num_list를 lndexing 하면서 'M'과 가장 가까운 값을 찾아내면 됩니다.

import itertools

N, M = map(int, input().split())
num_list = list(map(int, input().split()))
idx_list = [i for i in range(N)]

#combination_list = []
best_value = 9999999

for a,b,c in itertools.combinations(idx_list,3):
    value = num_list[a] + num_list[b] + num_list[c]
    
    if M - value < 0:
        continue
    
    if best_value >= M-value:
        best_value = M-value
        result = value

print(result)

 

 

댓글