본문 바로가기
Algorithm/baekjoon

baekjoon 2473: 세 용액

by 갈잃자 2022. 6. 22.

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

 

2473번: 세 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 3 이상 5,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상

www.acmicpc.net

문제를 읽고 알고리즘을 구상 하였을때, 백트래킹문제로 생각을 하고 구현을 하였지만, n의 갯수가 5000까지 간다는점과 제한시간이 1초라는 걸 생각했어야 했다.


초기 구현했던 내 문제풀이 방식이다.

n = int(input())
arr = list(map(int,input().split()))
path = ['']*3
used=[0]*n
Min = 21e8
result = []
def dfs(level):
    global Min, result

    if level ==3:
        if Min > abs(path[0]+path[1]+path[2]):
            Min = abs(path[0] + path[1] + path[2])
            result = [path[0],path[1],path[2]]
        return

    for i in range(n):
        if used[i] ==1: continue
        used[i] =1
        path[level] = arr[i]
        dfs(level+1)
        used[i] = 0
dfs(0)
result.sort()
print(*result)

백트래킹을 이용해 0에 가까운 수(절댓값이 0에 가까운 수)를  찾게 끔 구현하였지만, n의 갯수가 커지는 만큼 branch가 커지므로 들어가야 할 길이 너무 많아져 시간초과가 나왔다.


 

이후 알고리즘 분류부분을 확인한 후 투포인터, 이진탐색등을 이용해야 된다는걸 깨달음...

n = int(input())
arr = list(map(int,input().split()))
arr.sort()
Min = float("inf")
result = []

for i in range(n-2):
    a3 = arr.pop()
	# 투포인터 진행
    st, ed = 0, len(arr)-1
    while(st != ed):
        Sum = a3 + arr[st] + arr[ed]
        if Min > abs(Sum):
            Min = abs(Sum)
            result = [a3,arr[st],arr[ed]]

        # Sum이 음수인 경우
        if Sum < Min:
            st+=1
        # Sum이 양수인 경우
        else:
            ed -= 1

        if Min ==0:
            break
    if Min ==0:
        break

print(*sorted(result))

'Algorithm > baekjoon' 카테고리의 다른 글

baekjoon 5052: 전화번호 목록  (0) 2022.06.30
baekjoon 9081: 단어 맞추기  (0) 2022.06.27
beakjoon 16500: 문자열 판별  (0) 2022.06.14
backjoon 11055: 가장 큰 증가 부분 수열  (0) 2022.05.19
backjoon 2469: 사다리 타기  (0) 2022.05.17

댓글