Baekjoon 문제 풀기 (2798번 : 블랙잭) Python

2798번 : 블랙잭

1. 문제읽기


brute force 문제

와! 드디어 문제를 풀었다!
계속 문제풀기 실패해서 너무 우울했는데 기분 좋아졌다.

일단 경우의 수를 구하는 코드를 짜는데 시간이 걸렸다.
그리고 리스트에 값을 넣어주고 정렬을 해서 맞는 값을 찾도록 했다.

2. 제출 코드


처음으로 brute force 문제가 나왔다.
동빈북에서 살짝 공부하긴 했는데, 경우의 수가 많지 않으면 의심해보라고 했었던 것 같다.
수열 라이브러리를 몰랐기 때문에 for문을 3번 돌려서 경우의 수를 모두 구해주고,
합한 수를 새로운 리스트에 넣었다.
그리고 if문으로 total_list에 m 값이 있으면 그대로 출력, 없다면 m값을 넣고 오름차순으로 정리해준 뒤 m보다 하나 앞의 수를 출력했다.

n, m = map(int, input().split())

cardList = list(map(int, input().split()))
total_list = []

for i in range(len(cardList)):
    for j in range(i+1, len(cardList)):
        for k in range(j+1, len(cardList)):
            total = cardList[i]+cardList[j]+cardList[k]
            total_list.append(total)


if m in total_list:
    print(m)
else:
    total_list.append(m)
    total_list.sort()
    print(total_list[total_list.index(m)-1])

3. 공부할 것


다른 사람들의 코드를 보고 비슷한 방법이지만 살짝 달랐던 점과 라이브러리를 이용한 방법 두가지를 정리한다.

1) 비슷하지만 달랐던 코드

3중 for문으로 경우의 수를 구하는 것은 동일했다.
그러나 세 값의 합이 m을 넘어가면 continue로 답에서 아예 제외시켰고,
result 변수를 만들어서 m값에 가까운 수가 계속 갱신되게 했다.
나는 이렇게 변수 하나를 계속 갱신하는 방법에 약하다. 생각이 잘 안난다.

n, m = map(int, input().split())

cardList = list(map(int, input().split()))
total_list = []
result = 0

for i in range(len(cardList)):
    for j in range(i+1, len(cardList)):
        for k in range(j+1, len(cardList)):
            if cardList[i]+cardList[j]+cardList[k] > m:
                continue
            else:
                result = max(result, cardList[i]+cardList[j]+cardList[k])

print(result)
2) 순열 조합 라이브러리 itertools 모듈의 combinations 함수 사용
itertools.combinations(iterable, r)
iterable 중에서 r개를 선택할 수 있는 조합을 iterator로 리턴하는 함수

combinations 함수로 순열을 받아서 1번과 똑같이 변수 total 보다 크면 total에 값을 넣어주고, m보다 크다면 제외시켜서 답을 구한다.

from itertools import combinations

n, m = map(int, input().split())

cardList = list(map(int, input().split()))
total = 0

for cards in combinations(cardList, 3):
    if total < sum(cards) <= m:
        total = sum(cards)

print(total)

댓글남기기