boj 2470 두용액(골드5)

김준오·2021년 8월 16일
0

알고리즘

목록 보기
29/91
post-thumbnail

[boj 2470 두용액](https://www.acmicpc.net/problem/2470

투포인터 문제다

요즘 몇문제 풀었더니 투포인터 익숙해진거같다
나름 이 유형은 자신감이 좀 생긴것같은데?

문제 읽고 어떻게하면 되겠다 아이디어 자체는 바로 떠올라서 쭉 코드쓰고 돌린것같다

코드쓰고 돌려보고 완료확인할때까지 풀이시간은 약 20~25분 정도 쓴것같고 한번 틀렸다..

처음에 i == j-1 이면 바로 break하게 걸었어서 틀렸다
테스트케이스 제공 안되는상황이었으면 틀렸을수도 있겠다
실전이라 생각하고 제출전에 머릿속으로 쭉 돌려보고 제출하는 습관을 들여야겠다
물론 말은 이래놓고,, 그냥 귀찮아서 일단 제출 누르고 생각할것같기도한데 ㅎㅎ..

아이디어

입력이 10만개까지 가능하므로 모든 경우의수를 조합해서 푸는건 당연히 안되고
100000C2는 대충봐도 50억쯤 되므로
O(N) 내로 풀어야하는데 연속된 2개만 조합이 가능한게 아니므로 이대로 두고 투포인터를 쓰는것도 아닐거라 생각했다

그래서 핵심인 0에 가깝게 만들기 이니까 일단 정렬을 해주고
양끝점에서 부터 시작해서 더해가면서 값이 0보다 작으면 조금 크게 만들어주고
0보다 크면 조금 작게 만들어주고 하면서 매순간 어느정도 차이나는지를 저장하는 방식으로 생각했다

내 풀이

import sys
input = sys.stdin.readline

n = int(input())

arr = list(map(int,input().split()))
arr.sort()
minn = 9999999999
a = 0
b = len(arr)-1

i = 0
j = len(arr)-1

while(i != j):
  temp = arr[i] + arr[j]

  if temp == 0 :
    a = i
    b = j
    break

  else :
    if abs(arr[i] + arr[j] - 0) < minn:
      minn = abs(arr[i] + arr[j] - 0)
      a = i
      b = j

    if temp < 0 :
      i += 1

    else :
      j -= 1

print(str(arr[a]) + ' ' + str(arr[b]))

i와 j가 같아지면 전체경우를 다 돈것이므로 종료한다.
중간에 혹시 0이되는 경우를 찾으면 그대로 종료하게 만들었다

여러 경우의수가 있을경우 아무거나 출력하라고 했으므로 이렇게 하면 될것같다

결과

공부한것

새롭게 공부한건 없는것같다

아 갑자기 절대값 함수가 생각이안나서 검색해봤다
abs가 왜 떠오르지않았을까... 구지 따지자면 abs 이름 생각안나서 검색했다 ㅎㅎ!

끝!

profile
jooooon

0개의 댓글

관련 채용 정보