알고리즘/Python

[python] 백준 2789 - 블랙잭

제주도랏맨 2022. 1. 7. 02:14

https://www.acmicpc.net/problem/2798

 

2798번: 블랙잭

첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장

www.acmicpc.net

 

더보기

 

핵심 개념

Binary Search

Combination

 

부가 개념

파이썬 삼항 연산자

list를 key값으로 배열 시 key에 함수를 사용하기

 

풀이

from itertools import combinations

def binary_search(array, start, end, target):
  if(start >= end):# 종료조건
    return sum(array[start])

  mid = (start + end) // 2 + 1 if (start + end) % 2 == 1 else (start + end) //2

  # if sum(array[mid]) == target:
  #   return sum(array[mid])

  if sum(array[mid]) > target:
    end = mid - 1
  
  if sum(array[mid]) <= target:
    start = mid

  return binary_search(array, start, end, target)

[card_num, target] = list(map(int, input().split()))
card_list = list(map(int, input().split()))

card_combi = list(combinations(card_list, 3))

card_combi.sort(key=sum)

print(binary_search(card_combi, 0, len(card_combi) - 1, target))

 

1. input으로부터 카드 개수 car_num, 목표 숫자 target, 구성 카드 리스트 card_list를 불러온다.

2. combinations을 사용하여 전체 카드에서 3개의 카드를 뽑는 조합의 경우를 card_combi에 저장한다.

3. card_combi를 sum 함수의 값에 따라 정렬한다.

4. card_combi와 target을 이용하여 binary search를 수행한다.