For Programmer
백준 2798번 파이썬 문제풀이(브루트 포스- 블랙잭) 본문
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
'코팅테스트 > 백준 문제 모음' 카테고리의 다른 글
백준 7568번 파이썬 문제풀이(브루트 포스- 덩치) (0) | 2021.10.06 |
---|---|
백준 2231번 파이썬 문제풀이(브루트 포스- 분해합) (0) | 2021.10.06 |
백준 11729번 파이썬 문제풀이(재귀 - 하노이탑 이동 순서) (0) | 2021.10.05 |
백준 2447번 파이썬 문제풀이(재귀 - 별 찍기 - 10) (0) | 2021.10.05 |
백준 10870번 파이썬 문제풀이(재귀 - 피보나치 수5) (0) | 2021.10.05 |
Comments