알고리즘&자료구조/Algorithm

[백준 2798] 블랙잭

백엔드 개발자 - 젤리곰 2024. 2. 1. 22:35
728x90

1. 문제

 

 

2798번: 블랙잭

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

www.acmicpc.net

 

⭐문제 요약

1. 첫째줄 N (3<= N <= 100)과 M ( 10 <= M <= 300,000)이 주어짐.
2. N장의 카드에서 3장을 뽑아 합이 M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 출력하기.

 

2. 풀이

import itertools

f_line = list(map(int,input().split()))
N = f_line[0]
M = f_line[1]

numbers = list(map(int,input().split()))
combi = list(itertools.combinations(numbers,3))

max_sum = 0
for cb in combi:
    cb_sum = sum(cb)
    if cb_sum <= M and cb_sum > max_sum:
        max_sum = cb_sum

print(max_sum)

 

3. 새롭게 알게된 점

✔️파이썬의 map과 자바의 map은 다르다.

map은 '키-값' 쌍의 자료구조가 아니라 함수를 적용하여 새로운 결과를 만드는데 쓰인다.

map(function, iterable)

 

iterable에는 리스트나 튜플이 들어갈 수 있다.

def square(number):
    return number ** 2

numbers = [1, 2, 3, 4, 5]
squared = map(square, numbers)

print(list(squared))  # [1, 4, 9, 16, 25]

squared에 map 객체를 담는다.

map 객체는 각 요소에 대한 연산을 당장 수행하지 않고, 이러한 요소들이 실제로 필요할 때 값을 계산한다.

따라서 map 객체는 결과를 메모리에 저장하지 않기 때문에 메모리를 효율적으로 사용할 수 있다.

연산 결과를 반복적으로 사용하려면 list함수를 쓰면 된다.

 

✔️파이썬의 itertools 라이브러리 

itertools는 파이썬에서 효율적인 반복 및 데이터 스트림 처리를 위한 중요한 도구다.

순열, 조합 문제에서 유용하게 쓸 수 있다.

 

1) permutations(반복가능한 객체, r)

import itertools

# 순열을 구할 리스트
items = [1, 2, 3]

# 모든 2개 요소의 순열 생성
print("순열 (Permutations):")
for p in itertools.permutations(items, 2):
    print(p)
    
#결과
#(1, 2)
#(1, 3)
#(2, 1)
#(2, 3)
#(3, 1)
#(3, 2)

 

- 반복 가능한 객체에서 중복을 허용하지 않고 r개를 뽑아 나열한다.

순서에 의미가 있기 때문에 순서가 다르면 다른 것으로 취급한다.

위 결과를 보면 (1,2)와 (2,1)은 다른 것이다.

 

2)combinations(반복가능한 객체, r)

import itertools

# 조합을 구할 리스트
items = [1, 2, 3]

# 모든 2개 요소의 조합 생성
print("조합 (Combinations):")
for c in itertools.combinations(items, 2):
    print(c)
    
#결과
#(1, 2)
#(1, 3)
#(2, 3)

- 반복 가능한 객체에서 중복을 허용하지 않고 r개를 뽑는다.

순서에 의미가 없다. (1,2)와 (2,1)은 같은 것으로 취급한다.

 

728x90