중복 없는 n개의 재료 번호가 주어질 때,
두 재료의 합이 m이 되는 경우의 개수를 구하는 문제이다.
리스트의 두 원소의 합을 고려하는 문제라..
투 포인터 알고리즘을 사용했다.
입력 받은 재료 번호를 크기 순서대로 정렬한 뒤,
left, right라는 포인터를 통해,
두 재료 번호의 합과 m 값을 비교하는 과정을 반복 수행했다.
코드(정답)는 다음과 같다.
# 1940
import sys
n = int(sys.stdin.readline())
m = int(sys.stdin.readline())
identifiers = list(map(int, sys.stdin.readline().rstrip().split()))
identifiers.sort()
left = 0
right = len(identifiers) - 1
count = 0
while left < right:
sum_identifiers = identifiers[left] + identifiers[right]
if sum_identifiers < m:
left += 1
elif sum_identifiers > m:
right -= 1
else:
count += 1
left += 1
right -= 1
print(count)
추가적으로 비슷한 논리로써 2중 for문을 생각할 수 있는데..
identifiers의 개수가 커지면 시간 복잡도가 커지는 문제가 있다.
그래서 투 포인터 알고리즘을 통한 선형적 접근이 더 적절해 보인다.