2467-g5 성공
This commit is contained in:
49
workbook_8708/gold/2467-g5.py
Normal file
49
workbook_8708/gold/2467-g5.py
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
# 용액
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
input = sys.stdin.readline
|
||||||
|
|
||||||
|
def solution():
|
||||||
|
n = int(input().rstrip())
|
||||||
|
|
||||||
|
lst = list(map(int, input().rstrip().split()))
|
||||||
|
|
||||||
|
result = float('inf')
|
||||||
|
answer = -1
|
||||||
|
l, r = 0, len(lst)-1
|
||||||
|
while l < r:
|
||||||
|
now = lst[l] + lst[r]
|
||||||
|
if abs(now) < result:
|
||||||
|
result = abs(now)
|
||||||
|
answer = (lst[l], lst[r])
|
||||||
|
result = min(result, abs(now))
|
||||||
|
if now == 0:
|
||||||
|
break
|
||||||
|
|
||||||
|
if now > 0:
|
||||||
|
r -= 1
|
||||||
|
else:
|
||||||
|
l += 1
|
||||||
|
|
||||||
|
print(*answer)
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
solution()
|
||||||
|
|
||||||
|
"""
|
||||||
|
걸린 시간: 33분
|
||||||
|
|
||||||
|
시간 복잡도: 모든 수를 한번씩 보기 때문에 O(n)이다.
|
||||||
|
|
||||||
|
해설: 모든 경우의 수를 확인해보는 것은 너무 많기 때문에 적절히 줄여서 볼 것만 확인해야 한다.
|
||||||
|
그 생각을 하게 되면 슬라이딩 윈도우와 투 포인터를 떠올릴 수 있다.
|
||||||
|
그 다음 두 가지 포인터를 어떤 상황에서 뭘 움직일지를 정하면 되는데, 0, 1에서 오른쪽으로 출발한다고 하면
|
||||||
|
리스트가 오름차순이기 때문에 어떨때 뭘 옮겨야할지 애매해진다.
|
||||||
|
따라서 0, n-1에서 시작하면 l포인터는 오른쪽으로 가면 숫자가 커지고, r포인터는 왼쪽으로 가면 숫자가 작아지기 때문에
|
||||||
|
0보다 클 경우 숫자를 줄여야되니까 r포인터를 움직이고, 반대의 경우 l포인터를 움직이도록 설정하면 된다.
|
||||||
|
-100 -2 -1 103의 경우에서 처음이 -100 103으로 3이고, 양수이므로 r을 왼쪽으로 움직여서 -100과 -1로 -101을 만든다.
|
||||||
|
이때 -2와 103은 평생 볼일이 없는데 당연하게도 3보다 커질 것이 자명하므로 안 봐도 된다.
|
||||||
|
"""
|
||||||
Reference in New Issue
Block a user