일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 알고리즘
- 전자공학
- 코딩테스트
- 코테
- backjoon
- Trie
- 알고리즘문제풀이
- 백준
- dft
- IOS
- 이산신호처리
- 스위프트
- 트라이
- 컨볼루션
- 프로그래머스
- PYTHON
- 신호처리
- 카카오 코딩테스트
- SWIFT
- DTFT
- SWIFTUI
- 코테준비
- leet code
- Leet Coding Challenge
- 파이썬
- DSP
- 독서노트
- 릿코드
- leetcode
- 알고리즘 문제풀이
- Today
- Total
매일 매일 성장하는 섭섭군
[Seop's의 코드풀이] Back_Joon_2798_블랙잭_by_Python 본문
안녕하세요? 섭섭군입니다.
오늘은 백준 문제 2798번 블랙잭 문제를 풀어봤습니다.
우선 문제를 보면 다음과 같습니다.
https://www.acmicpc.net/problem/2798
문제
카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는
게임이다. 블랙잭은 카지노마다 다양한 규정이 있다.
한국 최고의 블랙잭 고수 김정인은 새로운 블랙잭 규칙을 만들어 상근, 창영이와 게임하려고 한다.
김정인 버젼의 블랙잭에서 각 카드에는 양의 정수가 쓰여 있다. 그 다음, 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓는다.
그런 후에 딜러는 숫자 M을 크게 외친다.
이제 플레이어는 제한된 시간 안에 N장의 카드 중에서 3장의 카드를 골라야 한다. 블랙잭 변형 게임이기 때문에, 플레이어가 고른 카드의
합은 M을 넘지 않으면서 M과 최대한 가깝게 만들어야 한다.
N장의 카드에 써져 있는 숫자가 주어졌을 때, M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 구해 출력하시오.
입력
첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며,
이 값은 100,000을 넘지 않는다.
합이 M을 넘지 않는 카드 3장을 찾을 수 있는 경우만 입력으로 주어진다.
출력
첫째 줄에 M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 출력한다.
나는 카드를 조합해서 나오는 모든 경우의 수를 구하고자 했다. 카드의 최대 개수가 총 100개이고 이중에서 3장의 카드를 선택하는 경우수는 161,700가지이다. 컴퓨터가 충분히 처리할 수 있을것이라 생각하여 완전탐색을 사용하는 알고리즘을 사용했다.
N,M = map(int, input().split(' '))
card_num = input().strip().split(' ')
card_num = list(map(int , card_num))
먼저 입력들을 사용하기 편하게 만들어 주었다. 기본적으로 입력이 들어오면 문자열로 들어오기 때문에 정수형으로 바꾸어주었으며
카드들은 list로 만들었다.
def black_jack(N,M,card_num) :
answer_list = []
for i in range(N-2) :
for j in range(i+1, N-1) :
for k in range(j+1 , N) :
ans_buf = card_num[i] + card_num[j] + card_num[k]
if ans_buf == M :
return ans_buf
elif ans_buf < M :
answer_list.append(ans_buf)
answer_list.sort()
return answer_list.pop()
이제 N장의 카드 중에서 3장의 카드를 골라야 한다.
i 에 있는 for문은 첫번째 카드를 고른다.
j 에 있는 for문은 두번째 카드를 고른다.
k에 있는 for문은 마지막 카드를 고른다.
총 3개의 카드를 골랐으니 이제 더해주기만 하면 된다. 더한 값이 M(블랙잭 값)이면 즉시 리턴되어 출력되고
M 값보다 작으면 답변들이 있는 리스트에 추가해 준다. M값을 넘어가면 버스트 이므로 아무런 조치를 취해주지 않는다.
이러한 방식으로 답변들이 있는 리스트를 모두 골라내었으면 오름차순으로 정렬한 후 마지막 값을 뽑아내면(Pop) 답이 나오게 된다.
무식해 보일 수 있는 완전탐색 알고리즘이지만 확실하고 간단하게 문제를 풀 수 있었다.
혹시 다른 좋은 방안이 있거나 비효율적인 코드라 생각되시면 언제든지 댓글을 달아주면 감사할 것 같습니다.
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[Seop's의 코드풀이] 백준 1431 시리얼 번호 - Python (0) | 2020.04.26 |
---|---|
[Seop's의 코드풀이] Back_Joon 10825 국영수 , Python (0) | 2020.04.21 |
[Seop's의 코드풀이] Back_Joon 9012 괄호 (0) | 2020.04.20 |
[Seop's의 코드풀이] Back_Joon 10828 스택 python (0) | 2020.04.20 |
[Seop's의 코드풀이] Back_Joon_1085_직사각형에서_탈출 (0) | 2019.10.24 |