1253-g4 성공
This commit is contained in:
54
workbook_8708/gold/1253-g4.py
Normal file
54
workbook_8708/gold/1253-g4.py
Normal 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? 수가 자연수만 있는 것이 아니었다. 당연히 자연수 범위라고 생각했는데 알고보니 절대값으로 범위가 표현되어 있었다.
|
||||
음수와 양수를 합치면 값이 줄어들기 때문에 타겟 숫자의 오른쪽도 후보가 될 수 있어서 모든 범위에 대해 계속 투포인터를 진행해야 한다.
|
||||
"""
|
||||
Reference in New Issue
Block a user