For Programmer

백준 2798번 파이썬 문제풀이(브루트 포스- 블랙잭) 본문

코팅테스트/백준 문제 모음

백준 2798번 파이썬 문제풀이(브루트 포스- 블랙잭)

유지광이 2021. 10. 6. 13:23
728x90

코드

n, m = map(int, input().split())

inputNumList = list(map(int,input().split())) #입력을 받아 리스트에 저장
sumSet = set() #중복을 허용하지 않는 set자료형 선언(입력받은 숫자 중 3개의 숫자 합을 저장하기 위해)
sumArray = [] #m보다 작거나 같은 원소만 저장하기 위한 리스트 선언


#반복문을 돌면서 3가지 숫자의 합을 구해야하는데 i==j 이거나 j==k이거나 i==k 일때는 중복이므로
#if문을 걸어 그 경우의 수를 제외시켜 준다.
for i in inputNumList: #입력받은 숫자에 접근
    for j in inputNumList[1:]: #입력받은 숫자의 맨앞원소의 바로 뒤에있는 원소부터 접근
        if i == j: #3개의 숫자중 첫번째 원소와 두번째 원소가 같을 때의 경우수는 반복문을 돌지 않는다.
            break
        for k in inputNumList[2:]: #입력받은 숫자의 맨앞원소의 다음 2번째 에있는 원소부터 접근
            if k == j or k == i: #3개의 숫자중 두번째 원소와 세번째 원소가 같을 때 혹은 첫번째와 세번째가 같은 경우수는 반복문을 돌지 않는다.
                break
            sumSet.add(i + j + k) #3가지 숫자의 합을 집합자료형에 대입하면 같은 수는 중복을 제거해준다.

for i in sumSet: #집합자료형을 돌면서
    if i <= m: #만약 원소가 m보다 작거나 같다면
        sumArray.append(i) #리스트에 그값들을 대입해준다.
print(max(sumArray)) #그 중에서 가장 큰 값을 출력

-> 위의 같은 경우는 3반복문 중첩을 통해 문제를 해결 하였다. 위의 문제에서는 n의 범위가 100이하라서 시간제한에 걸리지 않지만 그보다 커질 경우 시간초과에 걸릴 수 있다. 따라서 파이썬 라이브러리를 이용한 문제 해결법 또한 공부해놓으면 좋은 해결책이라고 생각한다.

 

from itertools import combinations

n, m = map(int, input().split())
card_list = list(map(int, input().split()))
result = 0 #결과값을 저장하기 위한 변수

for i in combinations(card_list, 3): #combinations 함수를 이용하면 파이썬에서 중복을 허용하지 않고 3개를 뽑아준다.
    if sum(i) <= m: #만약 그 3개의 합이 m보다 작거나 같다면
        result = max(result, sum(i)) #그 값을 result값에다 대입하는데 기존에 있던 result값이 크다면 대입하지 않는다.


print(result)

-> combinations함수를 이용하면 해당 리스트에서 있는 3개의 수를 중복없이 뽑아낸다. 굉장히 유용한 함수이다.

728x90
Comments