728x90
백준 2470 두 용액
https://www.acmicpc.net/problem/2470
2470번: 두 용액
첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00
www.acmicpc.net
배열 정렬후, 각 끝 인덱스 값 합과 target과 비교.
만약 합이 target보다 작으면 left + 1 이동
합이 target보다 크면 right -1 이동


📄 나의 풀이1
# 배열의 index를 left, right로 하고
# 가깝지 않으면 index 이동하는 방식으로 풀어야 하나..?
# 두 용액의 합이 0에 가까운지 비교
import sys
input = sys.stdin.readline
N = int(input())
solutions = list(map(int, input().split()))
# N = 5
# solutions = [-2, 4, -99, -1, 98]
solutions.sort() # [-99, -2, -1, 4, 98]
left = 0
right = N-1
target = 0
min_diff = float('inf')
result = [0]*2
while(left < right):
cur_sum = solutions[left] + solutions[right]
diff = abs(cur_sum - target)
if diff == 0:
result[0] = solutions[left]
result[1] = solutions[right]
break
if diff < min_diff:
min_diff = diff
result[0] = solutions[left]
result[1] = solutions[right]
# 범위 조정할 때는 음수, 양수 여부가 중요함!
if cur_sum < min_diff:
left += 1
else:
right -= 1
print(*result)
📄 나의 풀이2
import sys
N = int(sys.stdin.readline().rstrip())
solutions = list(map(int, sys.stdin.readline().rstrip().split()))
target = 0
result = [0]*2
s = sorted(solutions)
def binary_search(s, target, result):
min_diff = float("inf")
for idx in range(len(s)-1):
pl = idx+1 # 가장 작은 인덱스
pr = len(s) -1 # 가장 큰 인덱스
while pl <= pr:
mid_idx = (pl + pr) // 2
if s[idx] + s[mid_idx] == target:
result[0] = s[idx]
result[1] = s[mid_idx]
return result
diff = abs(0 - (s[idx] + s[mid_idx]))
if diff < min_diff:
min_diff = diff
result[0] = s[idx]
result[1] = s[mid_idx]
if s[idx] + s[mid_idx] < target:
pl = mid_idx + 1
else:
pr = mid_idx - 1
return result
print(*binary_search(s, target, result))
'알고리즘' 카테고리의 다른 글
백준 8983 사냥꾼 (0) | 2023.07.12 |
---|---|
[Hash Table] 백준 10816 숫자 카드 2 (0) | 2023.06.11 |
백준 2110 공유기 설치 (0) | 2023.05.31 |
데일리 알고리즘 230525 (0) | 2023.05.25 |
백준 10971, 외판원 순회 2 (0) | 2023.05.21 |