Algorithm & Problem Solving/투 포인터(Two Pointer)
[백준 3273] 두 수의 합 (Python)
baby_ohgu
2020. 12. 26. 23:19
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)
결과
문제풀이나 코드에서 이상한 부분 지적은 언제나 환영합니다!