728x90
#2470 두 용액
메모리 초과 오답
import sys
import itertools
input = sys.stdin.readline
n = int(input())
sol_list = list(map(int,input().split())) # 산도를 입력받음
combi_list = itertools.combinations(sol_list, 2) # 모든 조합 생성후 리스트에 담음
mixed_list = [sum(t) for t in combi_list] # 튜플로 구성된 리스트에서 튜플값들을 더하여 리스트에 다시 입력
acid_list = [abs(num) for num in mixed_list] # 해당 값들의 절대값을 리스트에 담음
min_mix = min(acid_list) # 그중 최소값을 찾음
for i in range(n):
for j in range(i+1, n):
# 최소값과 일치하는 값을 갖고 있는 두 조합을 선택하여 출력
if abs(sol_list[i] + sol_list[j]) == min_mix:
print(sol_list[i], sol_list[j])
break
# 이중 for문을 탈출하는 방법
else:
continue
break
투포인터 알고리즘을 이용한 정답 코드
import sys
input = sys.stdin.readline
n = int(input()) # 입력받을 숫자의 개수를 정수형으로 입력받음
sol_list = list(map(int, input().split())) # 숫자들을 입력받아 정수형 리스트로 저장
sol_list.sort() # 리스트를 정렬
# 투포인터 알고리즘 이용
left, right = 0, n-1 # 리스트의 가장 왼쪽과 오른쪽 포인터를 0, n-1로 초기화
min_mix = float('inf') # 가장 작은 합의 절대값을 초기화
result = None # 최종 결과값을 초기화
while left < right: # 왼쪽 포인터와 오른쪽 포인터가 서로 만날 때까지 반복
mix = sol_list[left] + sol_list[right] # 현재 두 값을 더함
if abs(mix) < min_mix: # 더한 값의 절대값이 현재까지의 최소값보다 작으면
min_mix = abs(mix) # 최소값을 업데이트
result = (sol_list[left], sol_list[right]) # 현재 조합을 결과값으로 저장
if mix == 0: # 두 값의 합이 0이라면
break # 반복문 탈출
elif mix < 0: # 두 값의 합이 0보다 작다면
left += 1 # 왼쪽 포인터를 오른쪽으로 한 칸 옮김
else: # 두 값의 합이 0보다 크다면
right -= 1 # 오른쪽 포인터를 왼쪽으로 한 칸 옮김
print(*result) # 결과값 출력
728x90
'Sketch (Programming Language) > Python' 카테고리의 다른 글
Baekjoon Training #1891 (0) | 2023.03.25 |
---|---|
Baekjoon Training #11501 (0) | 2023.03.16 |
Baekjoon Training #1062 (1) | 2023.03.10 |
Baekjoon Training #3085 (0) | 2023.03.09 |
Baekjoon Training #1715 (0) | 2023.03.05 |