반응형
[1] 문제
[2] 코드
N, M = map(int, input().split())
num_list = list(map(int, input().split()))
num_list.sort(reverse=True)
prev_sum = num_list[0] + num_list[1] + num_list[2]
sum = 0
flag = False
if prev_sum == M :
print(prev_sum)
else :
for i in range(N):
for j in range(i+1, N):
for k in range(j+1, N):
sum = num_list[i] + num_list[j] + num_list[k]
if (M - sum) < 0:
continue
if (M - prev_sum) < 0:
if (M - prev_sum) < (M - sum ):
if sum <= M :
prev_sum = sum
if sum == M:
flag = True
break
else :
if (M - prev_sum) > (M - sum):
if sum <= M :
prev_sum = sum
if sum == M:
flag = True
break
if (flag):
break
if (flag):
break
print(prev_sum)
나의 풀이 . . . ( 오랜만에 알고리즘을 다시 풀다보니 생각이 너무 안나서 너무 돌아갔다...)
N, M 에 각각 카드의 개수와 목표 수를 입력 받았고, num_list에 카드 개수만큼의 숫자를 입력받았다.
입력받은 num_list를 내림차순으로 정렬하고 큰 수부터 3개씩 선택하여 합한 후 모든 경우의 수를 비교하려고 했다.
prev_sum 에 큰 수부터 3개를 더한 값을 주고 sum 변수는 2번째부터의 합을 담을 용도로 변수를 지정했다.
flag 변수는 다중 for문에서 나오기 위해 선언했다.
if 문은 첫 번째의 합이 목표의 수인 M인지 아닌지를 나타냈다.
else 문부터 본격적인 코드인데 합하는 3개의 카드가 중복해서 선택하면 안되기에 3중 for문을 통해
( i = [ 0 ~ N-1] / j = [ i+1 ~ N-1 ] / k = [ j+1 ~ N-1 ] 로 나누었다.
if ( M - sum ) < 0 부분을 통해 3개의 합이 목표의 수 (M)보다 크면 "continue"를 통해 아래 코드를 실행 시키지 않고 바로 다음 for문을 진행시키도록 하였다.
목표의 수 M과 가까운 합을 구하는 것인데, 전의 합과 현재 구한 합을 비교할 때 음수이거나 양수일 때의 경우가 다르기에 if문을 통해 나누었다. // 숫자는 3개의 합을 의미 ex( -3 < -1 이면 -1 값이 더 가깝기에 교환 / 2 > 1 이면 1 값이 더 가깝기에 교환을 의미한다.)
3개의 합이 M과 같으면 뒤에 남아있는 for문을 돌릴 필요가 없으므로 flag값을 True로 바꾸어 다중 for문을 나가도록 3개의 if문을 써주었다.
( 간단한 문제였는데 생각이 나지 않아 너무 돌고 돌은 것 같다. 안 풀다가 풀다보니 알던 것들도 까먹은 것 같아 꾸준히 풀어야 겠다는 생각이 들었다.
이 문제의 핵심은 3개의 카드를 중복하지 않게 뽑는 거였다. 그리고 이 3개의 합을 전에 구한 값과 비교하며 M과 근접한 값을 찾는게 포인트였다. . .
[다른 사람 코드 (1) ]
N, M = map(int, input().split())
num_list = list(map(int, input().split()))
result = 0
for i in range(N):
for j in range(i+1, N):
for k in range(j+1, N):
if num_list[i] + num_list[j] + num_list[k] > M :
continue
else :
result = max(result, num_list[i] + num_list[j] + num_list[k] )
print(result
3개의 합이 M보다 크면 continue 값을 주고 아닌 경우에 M과 가장 가까운 수를 찾기 위해 max 함수를 통해 매개변수 둘중에 큰 값을 반환해 result 값에 저장하였다.
[ 다른 사람 코드 (2) ]
from itertools import combinations
N, M = map(int, input().split())
num_list = list(map(int, input().split()))
result = 0
for nums in combinations(num_list, 3) :
temp_sum = sum(nums)
if result < temp_sum <= M :
result = temp_sum
print(result)
파이썬에 제공하는 조합 라이브러리 itertools 모듈의 combinations 함수를 사용했다.
중복 되지 않게 3개의 카드를 뽑고 이를 sum 함수로 합해 temp_sum 변수 저장하고 이 값이 목표변수인 M과 전의 합 사이의 있으면 전의 합 값을 변경해주며 모든 경우의 수를 돌면서 M과 가장 가까운 값을 찾는다.
반응형
'Algorithm > Boj' 카테고리의 다른 글
[백준] 24445번 : 너비우선 탐색 - 파이썬 풀이 (0) | 2023.01.20 |
---|---|
[백준] 1388번 : 바닥 장식 - python 풀이 (0) | 2023.01.15 |
[백준 python 2447번] (0) | 2022.05.02 |
백준 1002 파이썬 터렛 (0) | 2022.02.07 |
백준 4948 파이썬 - '에라토스테네스 체' (0) | 2022.02.07 |