투 포인터를 활용한 문제
제한시간은 2초지만 N의 범위가 15,000까지기 때문에 O(nlogn)의 시간복잡도 내에 풀면 된다.
파이썬의 정렬 라이브러리인 sort를 이용할 수 있다. 파이썬의 정렬 라이브러리는 병합정렬 기반으로 O(nlogn)의 시간복잡도를 가진다.
정렬 후 맨 앞과 맨 끝 인덱스를 기준으로 비교를 시작한다.
둘의 합이 M이 됐다면 cnt++ 후 각 값을 1씩 옮긴다.
둘의 합이 M보다 작다면 시작 인덱스 i++를 한다.
둘의 합이 M보다 크다면 끝 인덱스 j--를 한다.
# 주몽
# 두 숫자를 합쳐 M이 되어야 한다. N개의 숫자와 M이 주어졌을 때 몇 개의 조합이 만들어지는지 구하시오.
# 첫째 줄에는 숫자의 개수N이 주어진다. 두 번재 줄에는 M이 주어진다. 세 번째 줄에는 N개의 숫자들이 공백을 가지고 주어진다.
# 개수를 출력하시오.
import sys
input = sys.stdin.readline
n = int(input())
m = int(input())
num = list(map(int, input().split()))
num.sort()
cnt = 0
i = 0
j = n - 1
while i < j:
if num[i] + num[j] == m:
cnt += 1
i += 1
j -= 1
elif num[i] + num[j] > m:
j -= 1
else:
i += 1
print(cnt)
'Code > Python' 카테고리의 다른 글
[Python] 백준 11003번 최솟값 찾기 (0) | 2023.09.26 |
---|---|
[Python] 백준 12891번 DNA 비밀번호 (0) | 2023.09.26 |
[Python] 백준 2018번 수들의 합 5 (0) | 2023.09.25 |
[Python] 백준 10986번 나머지 합 (1) | 2023.09.25 |
[Python] 백준 11660번 구간 합 구하기 5 (ps. 0으로 이루어진 리스트 만들기([[] * n] vs [[] for i in range])) (0) | 2023.09.23 |