BOJ 2798. 블랙잭 (Python)

2021. 2. 10. 12:15Problem Solving/BOJ

BOJ 2798. 블랙잭

https://www.acmicpc.net/problem/2798

 

2798번: 블랙잭

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

www.acmicpc.net

Logic

포문을 세번 돌려서 브루트-포스로도 풀 수는 있지만 효율적이지 않으니 패스.

나는 투포인터 로 풀었다.

 

  1. 입력받은 nums리스트를 오름차순으로 정렬한다.(중요한 작업)
  2. 0~N-2 까지 for문을 돌린다.
  3. left포인터는 i번째 바로 다음, right포인터는 끝을 가리킨다.
  4. left < right인 동안 sum이 M보다 크면 right포인터를 1 감소시켜 sum을 작게 만들도록 한다. sum이 M보다 작으면 max_sum을 갱신하고 left포인터를 증가시켜 sum을 크게 만든다.
  5. 이때 sum이 M과 같으면 프린트 해버리고 종료시킨다.
  6. 모든 경우의 수를 검사하고 나서 max_sum을 print한다.(max_sum이 M이여서 강제 종료 된 경우 빼고)

Solution

import sys

N, M = map(int,(sys.stdin.readline().strip().split()))
nums = list(map(int, sys.stdin.readline().strip().split()))

max_sum = 0
nums.sort()

for i in range(0, N-2):
    left = i + 1
    right = len(nums) - 1

    while left < right:
        sum = nums[i] + nums[left] + nums[right]
        if sum < M:
            max_sum = max(max_sum, sum)
            left += 1
        elif sum > M:
            right -= 1
        else:
            print(M)
            sys.exit(0)

print(max_sum)

 

 

sys.exit(0)

while문을 두번 빠져나오게 할 수 없어 사용했다. sys.exit(1)도 종료는 되지만 비정상적인 종료로 인해서 "런타임에러(NZEC)"(not zero exit code) 를 뿜게 되니 sys.exit(0)을 쓰면 된다.

반응형