1. 문제 정의
용액들의 특성값이 주어졌을 때, 서로다른 두 용액의 합이 0에 가깝도록 하는 두 용액을 찾는 프로그램을 작성하는 문제이다.
2. 풀이 방식
이분 탐색을 이용한 두 포인터 문제이다.
파이썬에서는 포인터의 개념이 없기 때문에 리스트의 인덱스 번호를 활용하였다.
입력받은 정수들을 저장한 리스트를 오름차순으로 정렬한 다음, 0번 인덱스(가장 작은 값)와 마지막 번 인덱스(가장 큰 값)의 합의 절댓값을 기준으로 하였다.
이후 while문을 이용하여 start와 end값의 조정을 통해 두 정수의 합(sum)과 answer를 비교하며 가장 작은 값이 answer에 저장되도록, 그리고 그때의 용액의 값이 result에 저장되도록 코드를 작성하였다.
또한 answer이 0이면 break하여 값을 바로 출력하도록 하였다.
sum이 음수일 경우, 0에 가까워 지도록 start를 증가 시키고, 양수일 경우도 마찬가지로 0과 가까워 지도록 end를 감소시킨다.
# 2470 두 용액 (두 포인터)
N = int(input())
li = list(map(int, input().split()))
li.sort()
start, end = 0, N-1
answer = abs(li[start] + li[end]) # 가장 작은 합
result = [li[start], li[end]] # 결과 리스트
while (start < end):
s_val = li[start] # 제일 작은 값
e_val = li[end] # 제일 큰 값
sum = s_val + e_val
if (abs(sum) < answer): # 처음의 합과 이후 연산을 통한 합 비교
answer = abs(sum) # 더 작은 값이 answer에 들어감
result = [s_val, e_val] # 그때의 두 용액
if (answer == 0): # 0이면 최솟값이기에 break
break
if (sum < 0): # 음수면 작은 값을 증가시킴
start += 1
else: # 양수면 큰 값을 감소시킴
end -= 1
print(result[0], result[1]) # 결과 리스트 출력
3. 후기
포인터의 개념에 대해 공부하게된 문제였다. 자료 구조를 배울 당시의 포인터에 대한 기억이 있었는데 정말 힘들었던 기억이 있다.
파이썬에선 포인터에 대한 개념이 존재하지 않는다. 그래서 리스트의 인덱스 번호를 이용하여 포인터 처럼 사용한다.
Do_ProgrammingTest/백준/Gold/2470. 두 용액/두 용액.py at main · Do-heewan/Do_ProgrammingTest
희완한 코딩테스트 준비. (Just do programming test like heewan.) - Do-heewan/Do_ProgrammingTest
github.com
'Coding-Test > 백준' 카테고리의 다른 글
[Python] 1697 - 숨바꼭질 (0) | 2025.01.21 |
---|---|
[Python] 1260 - DFS와 BFS (1) | 2025.01.20 |
[Python] 2343 - 기타 레슨 (0) | 2025.01.18 |
[Java] 2675 - 문자열 반복 (0) | 2025.01.15 |
[Python] 11663 - 선분 위의 점 (0) | 2025.01.15 |