본문 바로가기
Sketch (Programming Language)/Python

Baekjoon Training #2470

by 생각하는 이상훈 2023. 3. 14.
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