백준 2798 번 : 블랙잭
https://www.acmicpc.net/problem/2798
2798번: 블랙잭
첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장
www.acmicpc.net

< 문제 요약 >
- 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓는다.
- 딜러는 숫자 M을 크게 외친다.
- N장의 카드 중에서 3장의 카드를 골라야 한다.
- 고른 카드의 합은 M을 넘지 않으면서 M과 최대한 가깝게 만들어야 한다.

다음과 같은 루틴을 반복할 것입니다.
< 나의 코드 >
n,m = map(int,input().split()) # n과 m 입력받음
arr = list(map(int,input().split())) # n개의 값을 배열로 받음
arr.reverse() # 배열을 내림 차순으로 정렬
max_val = 0 # 최대값을 저장해 줄 변수 초기화
for i in range(0,n-2): # 첫번째 카드 인덱스
for j in range(i+1,n-1): # 두번째 카드 인덱스
for k in range (j+1,n): # 세번째 카드 인덱스
sum_val = arr[i]+arr[j]+arr[k] # 첫,둘,셋 카드의 합 저장
if sum_val > m: # 합이 m을 초과할 시 k를 하나씩 뒤로 넘김
continue
elif sum_val > max_val: # m을 초과하지 않고 합이 최댓값 보다 크면 최댓값 갱신
max_val = sum_val
break
else : # m을 초과하지 않고 최댓값 보다 작으면 이후k는 볼 필요가 없어서 j 인덱스를 +1
continue
print(max_val)
< 다른 사람의 코드 >
from itertools import combinations
n,m = map(int, input().split())
card = list(map(int, input().split()))
ans = 0
for i in combinations(card, 3):
if ans < sum(i) <= m:
ans = sum(i)
print(ans)
combination에 대한 공부가 필요할거같아 정리해 보았습니다!
https://ggami99.tistory.com/22
[Python] 순열(Permutations)과 조합(Combinations)
순열 순서대로 뽑아내는 것이며, 수학에서 nPr과 동일합니다. from itertools import permutations arr = ['a','b','c'] print(permutations(arr)) arr를 a,b,c 로 이루어진 문자배열이라고 했을때, arr를 permutation하여 출력
ggami99.tistory.com
간단하게 말씀드리자면 combination은 중복 없이 ab와 ba를 모두 같은 값으로 여긴다는 특징이 있습니다.
이러한 점을 공부한 뒤 코드를 보니 명확하게 이해가 갑니다!
card배열에서 3개의 조합을 모두 살펴보면서
m값 보다 작고 max값 보다 작은 값을 결과값으로 출력하는 간단한 코드였습니다.
'🏅Coding Test' 카테고리의 다른 글
| [파이썬, Python] 백준 11650 : 좌표 정렬하기 (1) | 2024.02.10 |
|---|---|
| [파이썬, Python] 백준 2839 : 설탕 배달 (0) | 2024.02.09 |
| [파이썬, Python] 백준 1436 : 영화감독 숌 (0) | 2024.02.09 |
| [파이썬, Python] 백준 19532 : 수학은 비대면강의입니다 (1) | 2024.02.09 |
| [파이썬, Python] 백준 2231 : 분해합 (1) | 2024.02.08 |