2023.03.21

3273번: 두 수의 합

N개의 원소 중 2개를 더했을 때 X 값이 되는 조합의 수를 구하는 문제이다.


일일히 2개를 픽해서 더하는 방식도 가능하겠지만, N이 크기 때문에 좀 더 효율적인 방식이 좋을 것이다.

그래서 사용하는 것이 투 포인터이다.


투 포인터 포인터를 2개 둬서 조건에 따라 해당 포인터를 이동시키면서 조건에 맞는 지 체크하는 형식이다.


우선, 투 포인터에서 중요한 점은 2개의 포인터 중 어떤 걸 옮길지 조건을 제시해주는 것이다. 원소들을 정렬하고, 포인터를 양쪽 끝에 둔다면…

첫번째 포인터는 가장 작은 값, 두번째 포인터는 가장 큰값을 가지게 된다.


포인터에 해당하는 두 수의 합이 X보다 작다면, 앞의 포인터를 이동 시키고 큰 경우는 뒤의 포인터를 이동시키는 방식으로 진행한다.


같은 경우는 어떻게 할까…?

같은 경우는 두 포인터를 모두 이동시킨다.

물론 모든 경우의 수를 보지는 않기에 시간 복잡도가 낮고, X에 가까워지도록 코드를 작성했기 때문에 X에 해당하는 경우의 수를 모두 찾을 수 있다.


풀이

import sys

if __name__ == '__main__':
    N = int(sys.stdin.readline())
    nums = list(map(int, sys.stdin.readline().split()))
    X = int(sys.stdin.readline())
    start = 0
    end = N-1
    count = 0
    nums = sorted(nums)
    while start < end:
        sums = nums[start] + nums[end]
        if sums == X:
            count += 1
            start += 1
            end -= 1
        else:
            if sums < X:
                start += 1
            else:
                end -= 1

    print(count)

Tags:

Categories:

Updated:

Leave a comment