본문 바로가기
프로그래밍/알고리즘 & 자료구조

백준 2470 : 두 용액 with 파이썬

by Play_With 2024. 2. 1.
반응형

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

 

2470번: 두 용액

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

www.acmicpc.net

 

# 포인트

1. 0과 가까운 경우를 찾기 때문에 abs()를 통해 절대값을 비교

n=int(input())
nums=list(map(int, input().split()))
nums.sort()

st, end=0, n-1
i, j=0,0
minv=2*1000000000+1

while st<end:
    result=nums[st]+nums[end]
    # print(i, j)
    if result==0:
        print(nums[st], nums[end])
        break # 합이 0이 되는 값을 찾았기 때문에 반복문 종료

    elif result>0:
        if min(minv, abs(result))==abs(result):
            minv=abs(result)
            i, j=st, end
        result-=nums[end]
        end-=1
    
    else:
        if min(minv, abs(result))==abs(result):
            minv=abs(result)
            i, j=st, end
        result-=nums[st]
        st+=1

if result!=0: # 합이 0이 되는 경우는 반복문에서 print()하기 때문에 result가 0이 아닐경우에만
    print(nums[i], nums[j])

 

2. 위의 코드보다 더 효율적인 코드

합이 0이 되는 경우와 그렇지 않는 경우를 나누기 보다는, 공통 코드를 묶을 수 있는 if abs(result) < minv : 를 이용하여 합이 최소가 되는 경우와 그때의 값들을 기록하기

n=int(input())
nums=list(map(int, input().split()))
nums.sort()
minn=2*(10**9)+1
st, end=0, n-1
i, j=0,0

while st<end:
    result=nums[st]+nums[end] # 밑에서 업데이트한 st, end로 result값 반복문을 돌때마다 새로 계산함
    
    if abs(result) < minn:    # 절대값과의 비교를 통해 0과 가까울때의 i,j값 갱신
        minn=abs(result)  
        i, j=st, end
        
    if result > 0 :
        end-=1
    else :
        st+=1
        
print(nums[i], nums[j])
반응형

댓글