[백준] 2470 두 용액

cheeeese·2022년 9월 6일
0

코딩테스트 연습

목록 보기
140/151
post-thumbnail

📖 문제

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

💻 내 코드

import sys

n=int(sys.stdin.readline())
mlist=list(map(int, sys.stdin.readline().split()))

mlist.sort() # 입력 받은 값을 정렬

start=0
end=n-1
m=1e9*2 # 가장 0에 가까운 두 용액의 값을 저장할 값

res=[0,0] 

while start<end: # start 인덱스가 end 인덱스보다 작을 때까지
    x=mlist[start]+mlist[end] 
    if abs(x)<m: # 만약 차이가 더 0에 가깝다면
        m=abs(x) # 저장
        res=[mlist[start], mlist[end]]
        if x==0: # 그 차이가 0이라면 가장 가까운 것이므로 더 볼 필요 없이 break
            break
    if x<0: # 만약 차이가 음수라면
        # 리스트가 sort되어 있으므로 더 작은 쪽의 인덱스를 늘려주어
        # 차이를 0과 더 가깝게 만들어줌
        start+=1 
    elif x>0: # 차이가 양수라면
        # 더 큰 쪽의 인덱스를 줄여준다
        end-=1

print(res[0], res[1])

💡 풀이

  • 투 포인터를 잘 몰라서 처음에는 조합이랑 for문 사용해서 풀었더니 메모리 초과랑 시간 초과가 났다
  • 투 포인터는 배열의 인덱스를 가리키는 두 개의 포인터를 만들어서 값을 비교하는 것
  • 여기서는 0에 가장 가까운 수를 찾아야 하므로 만약 차이가 음수라면 0과 더 가깝게 만들어주기 위해 조금 더 큰수를 더해주어야 하고 차이가 양수라면 반대

0개의 댓글