[Python] 백준 2798: 블랙잭
https://www.acmicpc.net/problem/2798
2798번: 블랙잭
첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장
www.acmicpc.net
ANS
N,M = map(int, input().split())
card_list = list(map(int, input().split()))
ln = len(card_list)
tmp = []
for i in range(N):
for j in range(i+1,N):
for k in range(j+1,N):
if card_list[i] + card_list[j] + card_list[k] > M:
continue
else:
tmp.append(card_list[i] + card_list[j] + card_list[k])
print(max(tmp))
🔑
어떻게 보면 간단한 문제지만 어떻게 보면 정말 삼중 for문 말고 답이 없나? 싶게 만드는 문제. 사실 삼중 for문도 for문이지만 append를 이용해서 tmp에 하나하나 추가해야 하는데 이 방법이 최선인가? 싶었다.
특히 나는 종종 런 타임 에러가 뜨거나 비효율적인 코드라는 말을 적지 않게 들어서 다른 방법으로 구현을 해보고자 했으나 삼중 for문을 사용하는 방법을 제외하고 카드들을 뽑아낼만한 방법이 떠오르지가 않았다.
가장 작은 카드를 i라고 생각하고, i를 뽑은 후 범위를 재정의한 후(i+1부터 N까지 뽑을 수 있다.) j를 뽑고 마찬가지의 과정을 수행한 후 k를 뽑는다.
코드 자체는 어려운 코드도 아니고 복잡한 알고리즘을 요구하지는 않는데, 생각이 자칫 꼬일 수 있는(나는 문제를 풀 때 범위 재정의에 대한 생각을 잘 하지 못했다. 예를 들어 1 2 3을 뽑고, 2 1 3을 뽑는 경우를 다 고려해야 한다고 생각해 문제 접근에 어려움을 겪었다.) 부분이 있어 접근에 어려움을 겪었다.
전체 탐색을 두려워하지 말고 우선 알고리즘을 짜본 후 줄일 부분이 있는지 고민하는 시간을 꾸준히 가져야겠다... 우선은 구현하고 TC 성공을 한 후 타인의 로직을 보고 접근 방식을 터득하기😶