[백준] 블랙잭

최동혁·2022년 12월 6일
0

백준

목록 보기
12/68

풀이

첫번째 풀이

  • N 과 M 을 입력받는다

  • 펼쳐진 카드들을 리스트로 받는다

    주의

    파이썬 3.xx 버전부터 리스트를 int형으로 만들기 위해서는 map으로 감싼 후 다시 list로 감싸줘야 list 전체 원소들이 int형이 된다

  • 3개의 원소들을 탐색하기 위해서 for 문을 3중으로 감싼다.

    • 맨 앞의 수를 위한 for문(N-2까지)
      • 두 번째 수를 위한 for문(맨 앞 수 + 1, N-1까지)
        • 세 번째 수를 위한 for문(두 번째 수 + 1, N까지)
          • 만약 세 수의 합이 M을 넘어간다면 더한 값을 초기화 해주고 continue
          • 세 수의 합이 M과 같다면 최대값이 M이 된 것이기 때문에 exit()를 써서 종료
          • M보다 작다면 max 함수를 이용해 sum_res와 비교하여 max값을 다시 sum_res에 저장 후 다시 루프
import sys

N, M = map(int, sys.stdin.readline().split())

num_list = list(map(int, list(sys.stdin.readline().split())))

res = 0
sum_res = 0
for i in range(N-2):
    for j in range(i+1, N-1):
        for k in range(j+1, N):
            sum_res = num_list[i] + num_list[j] + num_list[k]
            if sum_res > M:
                sum_res = 0
                continue
            elif sum_res == M:
                print(M)
                exit()
            else:
                res = max(res, sum_res)

print(res)

두번째 풀이

  • 파이썬에서 제공해주는 combination 라이브러리가 있다.

  • 조합이란 뜻인데 서로 다른 n개 중에서 r개를 취하여 nCr 을 구해주는 것이다.

  • 이 문제도 해석해보면 M C 3 을 구하는 것이기 때문에 combination 라이브러리를 사용하면 쉽게 풀 수 있다.

import sys
import itertools

N, M = map(int, sys.stdin.readline().split())

num_list = list(map(int, list(sys.stdin.readline().split())))

sum_list = list(itertools.combinations(num_list, 3))
res = 0
sum_test = 0

for i in range(len(sum_list)):
    sum_test = sum(sum_list[i])
    if sum_test > M:
        sum_test = 0
        continue
    elif sum_test == M:
        res = sum_test
        break
    else:
        res = max(res, sum_test)    
        
print(res)
profile
항상 성장하는 개발자 최동혁입니다.

0개의 댓글