BJ 2798 블랙잭
내가 시도한 방법
- N장의 카드를 배열로 입력받고,
- 재귀를 사용해서 조합을 구한다.
- 다만, 그 과정에서 카드의 합이 M을 넘으면 해당 조합의 탐색은 멈춘다.(가지치기)
(가지치기를 좀 더 효율적을 하기 위해 카드 배열을 내림차순으로 정렬)
def nCr(r, n, start, total):
global ans
if total > M:
return
if not r:
if ans < total:
ans = total
return
for i in range(start, n):
if not used[i]:
used[i] = 1
nCr(r-1, n, i+1, total + cards[i])
used[i] = 0
# N = 카드의 개수 / M = 목표 숫자(카드 3장의 합은 M을 넘지 않고 가장 가깝게)
N, M = map(int, input().split())
cards = sorted(list(map(int, input().split())), reverse=True)
ans = 0
used = [0] * N
nCr(3, N, 0, 0)
print(ans)
다른 사람 풀이를 보고 든 생각
💡 조합을 구할 때는 for와 재귀가 가능하다는 점은 알고 있었는데,
그동안 문제를 풀때는 항상 재귀만 사용해서 당연히 재귀로 접근했던 부분이 있었다.
하지만, 해당 문제는 고정적인 r값을 가지기 때문에 충분히 for문으로도 가능하다. 이번을 기회로 한번 더 연습해보고, 좀 더 습관처럼 문제를 푸는 것도 좋지만 어떤 게 더 효율적일지 어떤 선택지가 있는지 다양하게 접근해보려는 노력을 해야할 것 같다.
# for를 이용해서 전체 조합 다 구해보기
N, M = map(int, input().split())
cards =list(map(int, input().split()))
ans = 0
for i in range(0, N-2):
for j in range(i+1, N-1):
for k in range(j+1, N):
total = cards[i] + cards[j] + cards[k]
if ans < total <= M:
ans = total
print(ans)
Author And Source
이 문제에 관하여(BJ 2798 블랙잭), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@noggrie21/BJ-2798-블랙잭저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)