반응형
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])
반응형
'프로그래밍 > 알고리즘 & 자료구조' 카테고리의 다른 글
백준 1920 : 수 찾기 with 파이썬 (0) | 2024.02.03 |
---|---|
백준 2473 : 세 용액 with 파이썬 (0) | 2024.02.02 |
백준 1940 : 주몽 with 파이썬 (1) | 2024.02.01 |
백준 1644 : 소수의 연속합 with 파이썬 (1) | 2024.01.31 |
백준 2018 : 수들의 합 5 with 파이썬 (0) | 2024.01.31 |
댓글