[브루트포스/ BaekJoon] # 2798 블랙잭

su_y2on·2022년 3월 5일
0

알고리즘

목록 보기
28/47
post-thumbnail

백준 2798번
주어준 수를 넘지 않는 가장 가까운 3개의 숫자합 구하기



풀이 1. 브루트포스

  • 이문제는 N의 범위가 100이하기 때문에 브루트포스로 구현해도 충분히 되는 문제
  • 이때 3중 for문을 돌려도 되지만 for문으로 하나의 숫자를 투포인터로 나머지 두개의 숫자를 결정하는 방식으로 풀었습니다
answer = input().split()
nums = input().split()

N = int(answer[0])
M = int(answer[1])
nums = list(map(int, nums))
nums.sort() # 정렬

max_value = 0
def answer(N,M):
    global max_value
    for i in range(N-2):
        j = i+1
        k = len(nums)-1

        while j < k: # 투포인트 
            sum = nums[i] + nums[j] + nums[k]
            if sum < M:
                max_value = max(sum,max_value) # 갱신
                j += 1
            elif sum > M:
                k -= 1
            else:
                return M

    return max_value

print(answer(N,M))
  • i,j,k를 이용해서 3개의 숫자를 포인트 해줍니다.
  • 숫자의 합이 M보다 작을경우 max_value를 갱신해줍니다
  • 숫자의 합이 M보다 클경우 k를 앞으로 이동해서 합을 줄여줍니다
  • 숫자의 합이 M과 같을 경우 바로 M을 반환하고 종료를 합니다
    -> 여기서 함수로 구현을 해서 return으로 끝내줬지만 exit(0)을 이용해서 정상종료로 구현해도됩니다.




풀이 2. 콤비네이션

  • 주어진 숫자리스트에서 3개를 뽑는 조합을 이용
import itertools

max_value = 0
answer = input().split()
nums = input().split()

M = int(answer[1])
nums = list(map(int, nums))

def answer(M):
    global max_value

    for combi in itertools.permutations(nums,3):
        if sum(combi) <= M:
            max_value = max(max_value,sum(combi))
    
    return max_value
    
print(answer(M))

0개의 댓글