Algorithm & Problem Solving/투 포인터(Two Pointer)

[백준 3273] 두 수의 합 (Python)

baby_ohgu 2020. 12. 26. 23:19

www.acmicpc.net/problem/3273

 

3273번: 두 수의 합

n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는

www.acmicpc.net

 

문제풀이

N, arr, X : 입력값

 

투 포인터(left, right)를 이용하여 해결할 수 있다.

 

1. 배열(arr)을 입력받고 정렬을 해준다.

- 정렬을 하지 않으면 투 포인터를 정상적으로 사용할 수 없다.

 

2. left, right 를 이용하여 arr[left]와 arr[right]를 더해준다. (이 값을 tmp 변수에 저장)

- tmp가 X보다 작을 경우는 두 값의 합을 늘려줘야 하므로 left를 1 증가시킨다.

- tmp가 X일 경우, 쌍의 개수(ans)를 1 증가한다.

- tmp가 X보다 클 경우, right를 1 감소시키면서 tmp를 X와 인접할 수 있도록 tmp 값을 줄여준다.

 

3. 결과(ans)를 출력한다.

 

코드

import sys

if __name__ == '__main__':
    N = int(input())
    arr = list(map(int, sys.stdin.readline().split()))
    X = int(input())
    arr.sort()
    left, right = 0, N - 1
    ans = 0

    while left < right:
        tmp = arr[left] + arr[right]
        if tmp == X: ans += 1
        if tmp < X:
            left += 1
            continue
        right -= 1
    print(ans)

 

결과

 

문제풀이나 코드에서 이상한 부분 지적은 언제나 환영합니다!