[BOJ] 3273 두 수의 합
구현, 투 포인터, 정렬
해당 문제는 두 수의 합이 x인 개수를 세는 문제이다. 완전 탐색, 즉 O(N^2)을 사용하여 풀 수 있는 문제이다. 그리고 입력의 크기를 보면 길이가 10만이므로 최대 O(NlogN)까지 사용할 수 있음을 파악한다. 따라서 투 포인터 알고리즘을 생각해낼 수 있다.
- 리스트를 정렬한다
- 처음과 끝을 잡고 두 포인터를 이동하며 합이 x인 것을 찾는다 → O(2N) = O(N)
시간 복잡도가 대폭 감소됨을 알 수 있다.
import sys
def solution(n, x):
# 두 포인터 생성
front, back = 0, n-1
# 앞이 뒤를 넘어설 때 까지
answer = 0
while front < back:
tmp = li[front] + li[back]
# 두 합이 더 크면
if tmp > x:
back -= 1
# 두 합이 같다면
elif tmp == x:
answer += 1
front += 1
# 두 합이 더 작으면
else:
front += 1
print(answer)
if __name__ == "__main__":
N = int(sys.stdin.readline().rstrip())
li = list(map(int, sys.stdin.readline().rstrip().split()))
X = int(sys.stdin.readline().rstrip())
li.sort()
solution(N, X)