오뚝이개발자

[백준 2473] 세 용액 - 파이썬(Python) 본문

코딩 테스트/백준

[백준 2473] 세 용액 - 파이썬(Python)

땅어 2022. 9. 9. 17:01
728x90
300x250

 

 

문제


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

 

2473번: 세 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 3 이상 5,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상

www.acmicpc.net

 

나의 풀이


그냥 n개의 원소 중 임의의 3개를 뽑아서 합을 구하는 방식으로 하게 되면 시간복잡도가 O(n^3)까지 올라가게 된다. 따라서 투 포인터를 사용해서 O(n^2)으로 풀어야 통과할 수 있다. i를 0~n-2까지 순회하면서 left와 right를 바꿔주어야 한다. 아래 코드는 python으로는 시간초과가 나왔고 pypy로 통과하였다. 서치를 해보니 대부분의 해답들이 pypy로 제출해 통과하였고, python으로 제출해 통과하려는 경우엔 iter를 사용해 좀 더 python스럽게 코드를 작성해야 한다.(하지만 이게 본 문제 알고리즘 풀이의 핵심이 아니므로 넘어가도록 한다.)

투 포인터(그림 출처 : cieske tistory)

 

코드


# https://www.acmicpc.net/problem/2473
import sys
input = sys.stdin.readline

N = int(input())
arr = list(map(int, input().strip().split()))
arr.sort()
ans = [0, 0, 0]
res = float('inf')

for i in range(N-2):
    l, r = i+1, N-1
    while l < r:
        curr = arr[i] + arr[l] + arr[r]
        if abs(curr) < abs(res):
            ans = [arr[i], arr[l], arr[r]]
            res = curr
        if curr > 0:
            r -= 1
        elif curr < 0:
            l += 1
        else:   # curr == 0
            print(arr[i], arr[l], arr[r])
            sys.exit()
for num in ans:
    print(num, end=' ')

 

 

 

 

 

728x90
300x250
Comments