모눈종이에 사각사각

[백준 2470] 두 용액 본문

CodingTest/Baekjoon

[백준 2470] 두 용액

모눈종이씨 2022. 5. 12. 01:28

🍎[백준 2470] 두 용액

문제링크

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

 

2470번: 두 용액

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

www.acmicpc.net

 

⚾ 코드

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

left, right, start, end = 0, n-1, 0, n-1

while left < right:
    if abs(array[start]+array[end]) > abs(array[left]+array[right]):  # 정답 갱신
        start, end = left, right

    # 다음으로 움직일 포인터 정하기
    # 이동했을 때 0에 더 가까운 쪽으로 이동
    if abs(array[left+1]+array[right]) > abs(array[left]+array[right-1]):
        right -= 1
    else:
        left += 1

print(array[start], array[end])

 

🔔 해결 과정 & 깨달은 점

- 우선 0에 가까운 두 값을 구하므로, 정렬을 해서 양쪽에서 가운데로 다가오면서 비교를 해야 겠다고 생각했다.

- array를 정렬한다.

- left와 right를 각각 첫 번째 인덱스, 마지막 인덱스로 초기화한다.

- 반복문을 시작하는데, 조건은 left < right 일 때 까지이다.

- 처음에 left<=right라고 했더니, 같은 용액을 선택하는 경우가 발생했다. 서로 다른 두 용액을 섞어야 하므로, 같다는 조건은 제외해줘야 한다.

- 반복문을 돌면서, 정답(start, end)과 비교하여 0에 더 가까운 값이라면 갱신한다.

- 그리고 다음 움직일 포인터를 정한다.

- left를 1증가시켰을 때, 혹은 right를 1감소시켰을 때 0에 더 가까운 값으로 포인터를 움직인다.

- 위의 과정을 반복하면 정답이 나온다.

'CodingTest > Baekjoon' 카테고리의 다른 글

[백준 15649] N과 M (1)  (0) 2022.06.27
[백준 19637] IF문 좀 대신 써줘  (0) 2022.06.12
[백준 20922] 겹치는 건 싫어  (0) 2022.05.11
[백준 15686] 치킨 배달  (0) 2022.04.21
[백준 1719] 택배  (0) 2022.04.12
Comments