문제
풀이
투 포인터를 이용하면 된다.
n, k = map(int, input().split())
arr = []
for i in range(n):
arr.append(int(input()))
arr.sort()
두 개의 합이 k이하가 되어야 하기 때문에 입력받은 배열을 정렬해준다.
res = 0
valSum = 0
j = n - 1
for i in range(n):
while j != 0 and arr[i] + arr[j] > k:
j -= 1
if j <= i:
break
res += j - i
이 후 투포인터로 문제를 해결한다.
i와 j로 순회하며
j 위치와 i위치의 원소 합이 k이하일 때 까지 순회한다.
이 때 i는 오른쪽으로 j는 왼쪽으로 진행한다
반복을 종료한 후의 i와 j는 합이 k 이상인 상태이기 때문에
j값에서 i값을 빼주면 된다.
만약 j와 i가 교차되었다면 진행이 의미가 없으므로 반복을 탈출한다.
코드
n, k = map(int, input().split())
arr = []
for i in range(n):
arr.append(int(input()))
arr.sort()
res = 0
valSum = 0
j = n - 1
for i in range(n):
while j != 0 and arr[i] + arr[j] > k:
j -= 1
if j <= i:
break
res += j - i
print(res)
'알고리즘' 카테고리의 다른 글
[백준 파이썬] 1701 Cubeditor (0) | 2024.04.04 |
---|---|
[코드트리 파이썬] 1이 K개 이상 존재하는 부분 수열 (2) | 2024.04.01 |
[코드트리 파이썬] 바구니 안의 사탕 (0) | 2024.03.28 |
[코드트리 파이썬] 가장 짧은 부분합 (1) | 2024.03.25 |
[코드트리 파이썬] 팀으로 하는 틱택토 (0) | 2024.03.21 |