티스토리 뷰

728x90

문제

www.acmicpc.net/problem/2470

 

2470번: 두 용액

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

www.acmicpc.net

 

풀이

1. 입력받은 용액 값을 오름차순으로 정렬한다.

2. start 값에 0, end 값에 n-1, cstart 값에 start값, cend값에 end값 대입 후 while문을 통해 인덱스 차이를 줄여가며 배열 값이 음수에서 양수로 넘어가는 부분까지 계산을 해줄 예정

[-99, -2, -1, 4, 98]  -> -99+98 계산한 값 czero 값에 담고 while 문 시작

3. while문의 조건은 음수에서 양수로 넘어가는 부분까지 계산을 해줄 예정이기에 start<end 인 경우에만 돌아가게 하면 된다.

4. 현재의 start, end 인덱스에 존재하는 값의 합이 czero 보다 작다면 czero 값에 대입해주고 cstart와 cend 값도 바꿔주고, czero 값이 0일 경우엔 더이상 while 문을 돌리지 않고 break

5. tmp 값이 음수 -> start += 1, tmp 값이 양수 -> end -=1

 

소스코드

import sys
input = sys.stdin.readline

n = int(input())
arr = sorted(list(map(int, input().split())))

start = 0
end = n-1
czero = abs(arr[start]+arr[end])
cstart = start
cend = end

while start<end:
    tmp = arr[start]+arr[end]
    if abs(tmp) < czero:
        cstart = start
        cend = end
        czero = abs(tmp)
        if czero == 0:
            break
    if tmp > 0:
        end -= 1
    else:
        start += 1

print(arr[cstart], arr[cend])
반응형