본문 바로가기
Problem Solving

[백준] 2798 블랙잭 python 알고리즘 문제

by DuncanKim 2022. 4. 20.
728x90

문제 2798. 블랙잭

1. 나의 코드와 발상 과정

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

card_num.sort(reverse = True)
card_sum = []
for i in range(n):
    for j in range(n):
        for k in range(n):
            if i == j or i == k or j == k:
                continue
            card_sum.append(card_num[i]+card_num[j]+card_num[k])
card_sum.sort(reverse = True)
for i in range(len(card_sum)):
    if int(card_sum[i]) > m:
        continue
        
    else:
        print(card_sum[i])
        break

리스트 중독 수준이다.

 

그래도 빨리 찾아서 탈출하게 하려고 card_num 리스트를 내림차순으로 정렬하여 더했다.

(그러면 나중에 card_sum에서 더 빨리 찾을 수 있지 않을까 하고... 내림차순을 해보았다.)

 

인덱스 0, 1, 2 / 0, 1, 3 / .... / 1, 2, 3 / 1, 2, 4 / .... 각각 더한 값을 새로운 리스트(card_sum)에 집어넣는다.

삼중 for문에서는 i == j or i == k or j == k를 통해서 같은 값을 더하는 것을 막아주었다.

 

그다음 또 한 번 내림차순을 실시하여 큰 값부터 정렬하게 하였다.

if를 통해 m보다 크면 continue 하게 하였고, 아닐 경우 바로 탈출하게 로직을 짜보았다.

 

그랬더니 정답!

 

2. 고수님의 깔끔한 코딩

n, m = map(int, input().split())
num = list(map(int, input().split()))
l = len(num)
ans = 0
for i in range(0, l-2):
    for j in range(i+1, l-1):
        for k in range(j+1, l):
            if(num[i] + num[j] + num[k] > m):
                continue
            else:
                ans = max(ans ,num[i] + num[j] + num[k])

print(ans)

삼중 for문을 구현해 값을 찾는 것은 나와 비슷했지만,

각각의 range를 다르게 설정하여 모든 값을 중복 없이 더할 수 있게 하였다.

리스트 또한 사용하지 않고 단순한 연산만으로 끝나기 때문에 메모리를 차지하지 않는 방법이다.

 

ans 변수를 통해 m보다 큰 수의 경우 continue를 하게 했고, 적거나 같은 경우, 

max 함수를 이용하여 현재의 ans와 num[i]+num[j]+num[k]를 비교하여 더 큰 값을 ans에 남기게 하였다.

 

지역변수와 전역변수를 활용하고 for문의 반복 로직을 잘 구현해낸 것 같다...

 

3. 아쉬운 점

조금 더 for의 range를 활용한 방법이라던지, 지역변수와 전역변수를 활용한 구현에 익숙해져야 할 필요가 있을 것 같다...

list는 당분간 자제... 아니 활용할 수 있을 때는 꼭 활용할 것이다.

728x90

댓글