πŸ—οΈ Algorithm/🟩 λ°±μ€€

🟩 [λ°±μ€€] [Python] [Class5] 2467번_μš©μ•‘

Dbswnstjd 2022. 12. 8. 02:41

문제

https://www.acmicpc.net/problem/2467

 

2467번: μš©μ•‘

첫째 μ€„μ—λŠ” 전체 μš©μ•‘μ˜ 수 N이 μž…λ ₯λœλ‹€. N은 2 이상 100,000 μ΄ν•˜μ˜ μ •μˆ˜μ΄λ‹€. λ‘˜μ§Έ μ€„μ—λŠ” μš©μ•‘μ˜ νŠΉμ„±κ°’μ„ λ‚˜νƒ€λ‚΄λŠ” N개의 μ •μˆ˜κ°€ λΉˆμΉΈμ„ 사이에 두고 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μž…λ ₯되며, 이 μˆ˜λ“€μ€ λͺ¨λ‘ -

www.acmicpc.net

풀이

1) νˆ¬ν¬μΈν„°λ₯Ό μ‚¬μš©ν•œ 풀이

# λ°±μ€€ 2467번 문제 - μš©μ•‘
import sys
input = sys.stdin.readline

n = int(input())
liquids = list(map(int, input().split()))

left_idx = 0
right_idx = n - 1

ans = abs(liquids[left_idx] + liquids[right_idx])
ans_left = left_idx
ans_right = right_idx

while left_idx < right_idx: # left_idx와 right_idxλŠ” λ§Œλ‚˜λ©΄ μ•ˆλœλ‹€
    tmp = liquids[left_idx] + liquids[right_idx]

    if abs(tmp) < ans:
        ans_left = left_idx
        ans_right = right_idx
        ans = abs(tmp)

        if ans == 0:
            break
    
    if tmp < 0:
        left_idx += 1
    
    else:
        right_idx -= 1

print(liquids[ans_left], liquids[ans_right])

2) 이진탐색을 ν†΅ν•œ 풀이

# Binary Search
import sys
input = sys.stdin.readline

n = int(input())
liquids = list(map(int, input().split()))

ans = float("INF")
ans_left = 0
ans_right = 0

for i in range(n-1):
    current = liquids[i]

    start = i + 1
    end = n - 1

    while start <= end:
        mid = (start + end) // 2
        tmp = current + liquids[mid]

        if abs(tmp) < ans:
            ans = abs(tmp)
            ans_left = i
            ans_right = mid

            if tmp == 0:
                break
        
        if tmp < 0:
            start = mid + 1
        
        else:
            end = mid - 1

print(liquids[ans_left], liquids[ans_right])