1/26 Coding Test

김태준·2024년 1월 26일
0

Coding Test - BOJ

목록 보기
54/64
post-thumbnail

✅ Coding Test

🎈 2467 용액

산성 용액의 특성값은 1부터 10억, 알칼리성 용액의 특성값은 -10억부터 -1까지 음의 정수로 나타난다.
같은 양의 두 용액을 혼합한 용액의 특성값은 혼합에 사용된 각 용액의 특성값의 합으로 정의한다.
연구소에서는 같은 양의 두 용액을 혼합해 특성값이 0에 가장 가까운 용액을 만드려 한다.
예시로 [-99, -2, -1, 4, 98]인 경우 -99와 98을 혼합하여 특성값이 0에 가장 가까운 용액을 만들 수 있다.

산성용액, 알칼리성 용액이 특성값이 정렬된 순서로 주어질때 이 중 2개의 서로 다른 용액을 혼합해 특성값이 0에 가장 가까운 용액을 만들어내는 두 용액을 찾는 프로그램을 만들기.

import sys
input = sys.stdin.readline
n = int(input())
sol = list(map(int, input().split()))

start, end = 0, len(sol)-1
val = 1e12
left, right = 0, 0

while start < end:
    now_val = sol[start] + sol[end]
    if abs(now_val) <= val:
        val = abs(now_val)
        # 정답제출을 위해 변수로 저장.
        left = sol[start]
        right = sol[end]
    if now_val <= 0:
        start += 1
    else:
        end -= 1
print(left, right)

< 해설 >
초기 val을 흔히 쓰는 1e9를 사용했지만 문제에선 최대 범위가 20억에 가깝기에 틀렸다고 나온다.
문제를 꼼꼼히 읽어 범위를 지정해줄 필요를 느낀 문제.

전체적인 로직은 다음과 같다.

  1. 입력값들을 모두 처리해주고, 결과적으로 2개의 숫자를 더했을때 0과 가까워야 하는 숫자 2개를 출력해야 하기에, 인덱스 겸 이분 탐색을 위해 start, end 와 left, right를 설정한다.
    그러고 값들을 비교해주기 위해 val로 1e12 만큼 큰 숫자를 저장해준다.
  2. 이분 탐색을 통해 주어진 배열의 처음, 끝을 더해 now_val로 두고 이 값이 0보다 작으면 start 인덱스를 하나 늘리고 0보다 크면 end 인덱스를 하나 줄여준다.
  3. 만일 현재 더한 값이 val보다 작거나 같다면 값들을 갱신해주고 결과로 제출할 left, right 변수 값도 변경해준다.
profile
To be a DataScientist

0개의 댓글