본문 바로가기

Algorithm/BOJ

[BOJ] 2470. 두 용액

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

 

2470번: 두 용액

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

www.acmicpc.net

 

 

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