😁 빅데이터 문제 풀기 & Study/- BAEKJOON 문제

[2798번] 블랙잭 / python3 (feat. for문이 여러개!!)

또방91 2021. 11. 7. 16:53
728x90

문제 링크: https://www.acmicpc.net/problem/2798

 

2798번: 블랙잭

첫째 줄에 카드의 개수 N(3 ≤ N ≤ 100)과 M(10 ≤ M ≤ 300,000)이 주어진다. 둘째 줄에는 카드에 쓰여 있는 수가 주어지며, 이 값은 100,000을 넘지 않는 양의 정수이다. 합이 M을 넘지 않는 카드 3장

www.acmicpc.net

 

 

블랙잭 문제를 본 순간 뚜둥

스쿨오브락의 잭 블랙이 생각이 나면서 문제를 풀기 시작했다... ㅋㅋㅋㅋㅋㅋ  

그래서인지 문제를 제대로 파악하지 못하고 실수를 하게 되는 사태가 발생 ㅋㅋㅋㅋㅋㅋ 

왜냐하면 내 머릿 속에 잭블랙이 영화 속에서 베이스키타를 들고

뚜뚱뚱~ 뚜둥 뚜둥~ 둥뚱 뚜두둥~~🎸

(이 멜로디를 아는 사람은 이렇게 텍스트만 봐도 멜로디를 흥얼거릴 듯)

아직도 무한도전에서의 잭 블랙의 표정이 떠오르면서 다시 문제를 제대로 풀어보쟈쟈쟈🔥

 

 

 

 

 

 

 


❌ 1차시도 실패

먼저 찾은 것을 하나씩 리스트에서 제거하면서 풀려고 시도했었다.

그런데 그러면 다시 처음돌아가서 반복해서 풀때 리스트에서 없어져버렸으니,

리스트[1]을 처음으로 다시 시작할거란 예상과 달리 리스트[3]를 처음 수로 시작하고 있었다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#1차시도: 반복문으로 하나씩 꺼내면서 제외시키고 반복문 돌리고 
n,m= map(int,input().split())
card=list(map(int,input().split()))
candi=[ ]   
 
for i in card:
    card.remove(i)
    for j in card:
        card.remove(j)
        for k in card:
            candi.append(i+j+k)
 
result=[i for i in candi if i <=m]
print(max(result))        
 
cs

❓ 정답은 ??

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#2차시도: 반복문으로 앞에서부터 하나씩 꺼내고 
#그 다음껀 앞에꺼 제외하고 또 반복돌리고~또제외하고 돌리고 나온 조합들 리스트에 넣기
 
n,m= map(int,input().split())
card=list(map(int,input().split()))
candi=[ ]     #candi 후보 리스트에 넣기
 
for i in range(n):
   for j in range(i+1,n):
       for k in range(j+1,n):
           candi.append(card[i]+card[j]+card[k])
 
result=[i for i in candi if i <=m]
print(max(result))        
cs

💯 풀이 과정

앞에 for반복문에서 사용했던 애는 remove하지말고 그 다음 반복문에서 빼고 범위를 설정하면 되는 거였다.

그렇게 3개 카드를 선택해서 만들어진 리스트 중

 

candi 후보리스트에서 리스트 컴프리핸션을 이용해 m이하 조건을 만족하는 애들을 추려내는

result 결과 리스트에 넣어놓고 최대값을 찾으면 답이 나옴!


😎오늘의 한줄평: 어떤 것을 제외해서 돌릴 때는 삭제하기보다는 범위 설정을 통해 제외시켜보자.

리스트 컴프리핸션은 복잡하지만 이용하면 넘나 편한 것

728x90