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)은 같은 것으로 취급한다.
'알고리즘&자료구조 > Algorithm' 카테고리의 다른 글
[백준 2745] 진법 변환 (1) | 2024.02.05 |
---|---|
[백준 2566] 최댓값 (0) | 2024.02.05 |
[다익스트라 알고리즘]LeetCode 787.k정거장 내 가장 저렴한 항공권 | Python (1) | 2024.01.24 |
[다익스트라 알고리즘]LeetCode 743.네트워크 딜레이 타임 | Python (0) | 2024.01.18 |
[백트래킹] LeetCode 17. 전화번호 문자 조합 (1) | 2024.01.15 |