문제 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는 당분간 자제... 아니 활용할 수 있을 때는 꼭 활용할 것이다.
'Problem Solving' 카테고리의 다른 글
[백준] 11050 이항 계수 python 알고리즘 문제 (0) | 2022.04.20 |
---|---|
[백준] 2869 달팽이는 올라가고 싶다 python 알고리즘 문제 (0) | 2022.04.20 |
[백준] 2231 분해합 python 알고리즘 문제 (0) | 2022.04.20 |
[백준] 10250 ACM 호텔 python 알고리즘 문제 (0) | 2022.04.20 |
[백준] 2839 설탕 배달 python 알고리즘 문제 (0) | 2022.04.18 |
댓글