https://www.acmicpc.net/problem/2470
1. 해결방법
"""
1. 아이디어
- 투포인터를 이용
- start 는 맨 왼쪽, end는 맨 오른쪽 인덱스 위치로 설정
- 두 용액의 합(add_v)와 min_v의 값을 비교하고 더 작은 값을 min_v로 최신화
- add_v가 0보다 작으면 start + 1, 0보다 크면 end - 1
- 해당 인덱스의 값을 print
"""
2. 정답코드
import sys
input = sys.stdin.readline
N = int(input())
temps = sorted(list(map(int, input().split())))
min_v = sys.maxsize
left_v, right_v = 0, 0
start, end = 0, N - 1
while start < end:
left_v, right_v = temps[start], temps[end]
# 용액의 합
add_v = left_v + right_v
if abs(add_v) < min_v:
min_v = abs(add_v)
answer_left, answer_right = left_v, right_v
# 용액 비교
if add_v < 0:
start += 1
else:
end -= 1
print(answer_left, answer_right)
처음에는 이분 탐색을 진행하고 투포인터를 이용해서 문제를 해결하려 했으나, 시간초과가 우려될 뿐만 아니라 로직마저 틀려버려서 고생을 좀 했다.간단하게 투포인터만으로도 문제를 풀 수 있었는데 로직만 보면 골드 문제는 아니지만 본인처럼 이분 탐색과 헷갈리면 헤맬 수 있는 문제이다.
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 13305. 주유소 (0) | 2022.09.05 |
---|---|
[BOJ] 1541. 잃어버린 괄호 (0) | 2022.09.05 |
[BOJ] 2805. 나무 자르기 (0) | 2022.09.04 |
[BOJ] 1654. 랜선 자르기 (0) | 2022.09.04 |
[BOJ] 10816. 숫자 카드2 (2) | 2022.09.03 |