1253-g4 성공

This commit is contained in:
sm4640
2026-03-25 14:56:31 +09:00
parent 633494610a
commit ae9db766c4

View File

@@ -0,0 +1,54 @@
# 좋다
import sys
input = sys.stdin.readline
def two_pointer(l, r, nums, i, target):
while l < r:
if l == i:
l += 1
continue
if r == i:
r -= 1
continue
now = nums[l] + nums[r]
if now == target:
return True
if now < target:
l += 1
else:
r -= 1
return False
def solution():
n = int(input().rstrip())
nums = list(map(int, input().rstrip().split()))
sorted_nums = sorted(nums)
count = 0
for i in range(n):
if two_pointer(0, n-1, sorted_nums, i, sorted_nums[i]):
count += 1
print(count)
return
solution()
"""
걸린 시간: 40분
시간 복잡도: 모든 범위에 대해 투 포인터는 O(n)이고, 모든 숫자가 타겟이 되기 때문에 O(n^2)이다.
해설: 모든 것을 확인해야 하는 여부를 생각해봤을 때, 어떤 수가 있을지 모르기 때문에 다 봐야한다.
그럼 두 개의 조합을 모두 봐야 하나?를 생각했을 때 정렬해서 투 포인터를 쓰면 다 보지 않아도 된다.
이제 범위를 본인보다 작은 것들에서 투포인터를 진행하며 구현을 했다.
근데 틀렸다. 왜 why? 수가 자연수만 있는 것이 아니었다. 당연히 자연수 범위라고 생각했는데 알고보니 절대값으로 범위가 표현되어 있었다.
음수와 양수를 합치면 값이 줄어들기 때문에 타겟 숫자의 오른쪽도 후보가 될 수 있어서 모든 범위에 대해 계속 투포인터를 진행해야 한다.
"""