🧠 알고리즘
- 투 포인터(Two Pointers)
✔️ 동작 방식
[ 핵심 아이디어 ]
- 정렬된 수열에서 어떤 수( num )이 서로 다른 두 수의 합으로 표현되는지를 양쪽에서 좁혀오는 투 포인터로 탐색한다.
- 현재 수( num )의 인덱스는 합에 사용할 수 없으므로 제외한다
[ 로직 요약 ]
- 양쪽에서 좁혀오는 투포인터 탐색을 위해 수열을 오름차순 정렬
- 각 인덱스 idx에 대해 목표값 num 설정
- start, end 양쪽에서 좁혀오는 투포인터 탐색
- 모든 수에 대해 반복하여 누적된 answer가 정답
🧾 코드
import sys
def _main():
answer = 0
set_check = set()
for idx in range(n):
num = n_list[idx]
start, end = 0, n - 1
while start < end:
# 자기 자신 제외
if start == idx:
start += 1
continue
if end == idx:
end -= 1
continue
now_sum = n_list[start] + n_list[end]
if now_sum > num:
end -= 1
elif now_sum < num:
start += 1
elif now_sum == num:
answer += 1
break
return answer
n = int(sys.stdin.readline().rstrip())
n_list = sorted(list(map(int, sys.stdin.readline().rstrip().split())))
print(_main())
⏱️ 시간 복잡도
for idx in range(n) : 수 리스트를 선회 ( 선형 시간 )
while start < end : 해당 수 를 기반으로 투포인터 탐색 ( 선형 시간 )'코딩테스트 파이썬 > 백준' 카테고리의 다른 글
| 나무 자르기 ( 2805 번 ) (0) | 2026.01.01 |
|---|---|
| 랜선 자르기 ( 1654 번 ) (0) | 2026.01.01 |
| 수들의 합 5 ( 2018 번 ) (4) | 2025.12.30 |
| 열쇠 ( 9328 번 ) (0) | 2025.12.05 |
| 외판원 순회 ( 2098 번 ) (0) | 2025.11.24 |