https://www.acmicpc.net/problem/2467
문제
풀이
첫번째 줄에는 전체 용액의 수를 입력으로 받고, 두번째 줄은 각 용액의 특성값을 받아 liq라는 리스트를 생성한다. liq의 값들은 정렬된 순서로 주어졌기 때문에 두 용액의 합이 0에 가까운 정도를 구하기 위해서 투 포인터를 이용한다. 가장 작은 값과 가장 큰 값부터 시작해서 점차 안쪽의 용액 특성값의 합을 구하는 방식으로, 이를 위해 p1은 liq의 앞부분에서, p2는 liq의 뒷부분에서 시작하도록 한다. 출력값으로는 합해진 두 용액의 특성값을 가져가야 하기 때문에 small이라는 배열을 생성해 차례로 두 용액의 합, 앞 용액의 위치, 뒷 용액의 위치를 넣도록 한다. p1과 p2가 같은 위치를 가리키거나 용액의 합이 미리 0값을 가지지 않는 경우에 while문이 반복되도록 설정하고, 새로 구한 용액의 합이 기존의 값보다 0에 가까울 경우 small의 내용을 새롭게 갱신하도록 한다. 반대의 경우에는 새로 구한 용액의 합이 양수일 경우 p2의 값을 1만큼 감소시키고, 음수일 경우에는 p1의 값을 1만큼 증가시킨다. 이 과정을 모두 끝낸 뒤 small에 남아 있는 용액의 위치값을 가져와 합이 가장 0에 가까운 용액들의 특성값을 출력하도록 한다. 이를 코드로 구현하면 아래와 같다.
코드
n=int(input())
liq=[*map(int,input().split())]
p1=0
p2=n-1
small=[liq[p1]+liq[p2],p1,p2]
while ((p1!=p2) and (small[0]!=0)):
r=liq[p1]+liq[p2]
if abs(small[0])>abs(r):
small=[r,p1,p2]
else:
if r>=0:
p2-=1
else:
p1+=1
print(liq[small[1]],liq[small[2]])
결과
'Koala - 5기 > 코딩테스트 준비 스터디' 카테고리의 다른 글
[BOJ / Python] 1644 - 소수의 연속합 (0) | 2022.01.31 |
---|---|
[BOJ / C++] 2003 : 수들의 합2 (0) | 2022.01.31 |
BOJ 1644(python) : 소수의 연속합 (0) | 2022.01.31 |
[BOJ / C++] 14465 : 소가 길을 건너간 이유 5 (0) | 2022.01.30 |
[BOJ/c++] 9251 - LCS (0) | 2022.01.30 |