1467번-용액

uchan·2021년 8월 5일
0


문제 : https://www.acmicpc.net/problem/2467

문제

문제 조건에서 중요한 키워드는 오름차순으로 정렬되어서 주는 점과 혼합용액의 특성값의 최솟값이다. 즉, 우리가 구하고자 하는 값은 리스트(배열)에서 임의로 두 개의 값을 정하고 더하였을때 나오는 특성값 중 가장 작은 특성값을 만들 수 있는 두 개를 찾으면 된다. 이때 선형탐색의 방식으로 한다면 최대 n이 100000까지 존재하므로 100000 * 100000 로 시간이 걸릴 수 있다.
따라서 우리는 다른 탐색법을 사용해야된다

풀이

정렬되어 주어진다는 점을 이용하자. 필자는 다음과 같이 생각해봤다.
탐욕법(?) + 투 포인터

정렬되어 주어지므로 배열의 왼쪽에는 -에 가깝다고 가정하고 오른쪽에는 +에 가깝다고 생각하자. 그럼 음수 + 음수 와 양수 + 양수 보다는 음수 + 양수가 최솟값을 얻을 것이다. 따라서 왼쪽과 오른쪽에 포인터를 두고 계산할 때 혼합용액의 특성값이 -라면 왼쪽 포인터를 오른쪽으로 한칸 움직이고, +라면 오른쪽 포인터를 왼쪽으로 한칸 움직이면 된다.
이에 대한 코드는 다음과 같다.

# 오름차순으로 주어짐
# 투포인터 이용
import sys
sys.setrecursionlimit(100000)

n = int(input())
liquids = list(map(int,input().split()))
left = 0
right = n-1
_min = 2000000000
answer = []

def func(left, right):
    global _min, answer
    if left>=right:
        return
    cur = liquids[left]+liquids[right]
    if _min > abs(cur):
        answer = [liquids[left], liquids[right]]
        _min = abs(cur)
    if cur>=0: # 혼합용액의 특성값이 +일때
        func(left,right-1)
    else: # 혼합용액의 특성값이 -일때
        func(left+1,right)
func(left,right)
_str = ''
for ans in answer:
    _str += str(ans) + ' '
print(_str[:-1])

result


재귀함수가 아닌 while문으로도 구현할 수 있다!

0개의 댓글