본문 바로가기
PS/solved.ac

[CLASS 2]백준 2798번 - 블랙잭

by DawIT 2021. 1. 18.
320x100

2798번 : 블랙잭

 

본래 블랙잭은 21을 최대한 가깝게 맞추는 것이 목적이지만, 이 문제에선 M 과 가장 비슷한 수를 만드는 것이 목적이다.

 

내 코드:

cardNum, target = map(int,input().split())
cards = list(map(int,input().split()))
sortedCards = [i for i in cards if i <= target-3]
sortedCards.sort(reverse=True)
cardsLen = len(sortedCards)
def find(cardsLen,sortedCards):
    a = []
    for i in range(cardsLen-2):
        for j in range(i+1,cardsLen-1):
            for k in range(j+1,cardsLen):
                sum = sortedCards[i] + sortedCards[j] + sortedCards[k]
                if sum <= target:
                    a.append(sum)
                    break
    
    return max(a)

print(find(cardsLen,sortedCards))

 

일단 난 이렇게 풀었다.

 

먼저 숫자를 받아와서, target(M) - 3 이하의 원소만 남기고 제거한다. - 3 의 기준은 최소 3장의 카드를 합쳐야 하기 때문에 1,2,N 을 합쳤을 경우부터 이므로 최대 target - 3 이다.

 

이후 배열을 큰 수부터 정렬한 뒤, 모든 합을 다 계산해본다. 이때 break 가 들어갈 포인트가 중요한데, 계산한 합이 target보다 작아지는 순간 같은 i 와 j 를 공유하는 상황에서는 더 작은 합만 나오게 된다. (내림차순 정렬이므로) 그러므로 break를 주어서 불필요한 계산을 줄인다.

 

그리고 a 배열에서 가장 큰 수를 찾으면 된다.

 

romaking77 님의 코드:

def P(n,m,c):
	t=set()
	for i in range(n-2):
		for o in range(i+1,n-1):
			for p in range(o+1,n):
				s=c[i]+c[o]+c[p]
				if s<=m:
					t.add(s)
					break

	return max([*t])
print(P(*map(int,input().split()),list(sorted(map(int,input().split()))[::-1])))

 

나와 핵심 로직은 같지만, 집합 자료형을 이용하였다. 집합을 이용하면 같은 값이 반복하여 들어오는 것을 피할 수 있다.

댓글