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])))
나와 핵심 로직은 같지만, 집합 자료형을 이용하였다. 집합을 이용하면 같은 값이 반복하여 들어오는 것을 피할 수 있다.
'PS > solved.ac' 카테고리의 다른 글
[CLASS 2]백준 1181번, 1436번, 2609번 (0) | 2021.01.20 |
---|---|
[CLASS 2]백준 1018번 - 체스판 다시 칠하기 (0) | 2021.01.19 |
[CLASS 2]백준 2869번, 15829번, 1259번, 2839번, 11050번 (0) | 2021.01.18 |
[CLASS 2]백준 2231번, 2292번, 2775번 (0) | 2021.01.16 |
[CLASS 2]백준 1085번, 4153번, 10250번 (0) | 2021.01.15 |
댓글