문제 상황
N장의 카드에 써져 있는 숫자가 주어졌을 때, M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 구해 출력하시오
즉, 임의로 주어진 N장의 숫자 카드 중 3장을 골라 블랙잭 점수인 M을 넘지않는 선에서
가장 근접하게 (게임 승리조건으로) 3장을 선택한 점수를 출력하는 문제이다.
솔루션
주어진 카드 N장에 대해서 카드 3장을 뽑는 모든 경우를 살펴보고
블랙잭 점수 M을 넘지 않는 최대 점수를 가려내었다.
즉, N C 3의 경우 (중복을 제외하여 모든 카드의 경우의 수를 뽑기)를 고려한 솔루션으로
주어진 N장의 카드를 서로 다른 3개의 조합으로 구성해 모든 카드 뽑기 경우의 수를 살폈다.
솔루션 코드 작성
아래는 다음 솔루션을 적용해 파이썬으로 작성한 코드이다.
# 백준 2798번 블랙잭
# 카드 갯수, 블랙잭 점수
n, max_score = map(int, input().split())
# n장의 카드
card_list = list(map(int, input().split()))
# 블랙잭 승리 경우
win_list = []
# 블랙잭 최고점수 (브루트포스 알고리즘)
for i in range(0, n-2):
for z in range(i+1, n-1):
for x in range(z+1,n):
if(card_list[i] + card_list[z] + card_list[x] <= max_score):
win_list.append(card_list[i] + card_list[z] + card_list[x])
else:
pass
print(max(win_list))
마치며
이번 문제는 비교적 쉽게 구현할 수 있었다.
아마도, 문제를 보고, "모든 경우를 파악 후 해결"을 깨달았기에 쉽게 구현할 수 있었었다.
가능했던 이유
코드 구현에 들어가기 전, 문제를 고심히 살펴보고
주어진 조건에 대해 상황을 어떻게 해결해야할 지에 대한 단서를 찾았다.
그러한 단서를 찾으니, 어떤 식 (어떤 알고리즘)으로 구현해야 되는지를 알게되었다.
(이젠 단서로써, 어떤 알고리즘을 사용해야 되는지를 깨닫는다.)
따라서, 알고리즘의 깨달음으로 코드 구현방향이 정해지고, 쉽게 코드로 구현할 수 있었다.
정리해서
어떤 문제 상황에 맞이했을 땐,
주어진 조건에 대해 상황에서 어떤 단서들이 존재하는지를 파악한다.
그리고, 그러한 단서들로 어떤 알고리즘으로 설계될 수 있는지를 생각한다.
어떤 알고리즘을 깨닫게 된다면,
이를 코드 구현방향으로 정해 문제를 해결해낸다.
따라서, 우리가 백준 "알고리즘 문제"를 해결하는 이유는
다양한 문제 상황 속 적용되는 알고리즘들을 살펴보고
특정 상황속에서도 알맞은 알고리즘을 적용할 수 있는 '개발자!'로써 성장할 수 있는 발판을 마련해주기 때문이다.
나의 경험에 빗대어 보면, 풀스택 개발자로 다양한 상황 속 특정 알고리즘으로 무수한 상황을 해결해내는 능력을 길러내기 위해 백준 문제를 푼다.
(AI, 빅데이터든 여러 상황을 접하는 사람이 되고자 백준을 푼다. 개발 역량을 높혀 어떠한 영역도 도전하는 사람이 되고자 백준을 푼다.)
'📚 스터디 > 알고리즘' 카테고리의 다른 글
[백준 1259번] 팰린드롬수 (6) | 2023.07.11 |
---|---|
[백준 15829번] Hashing (0) | 2023.07.10 |
[백준 2331번] 분해합 (0) | 2023.07.09 |
[백준 1978번] 소수 찾기 (0) | 2023.07.08 |
[백준 1018번] 체스판 다시 칠하기 (파이썬) (0) | 2023.03.31 |