Python_알고리즘/Silver III

3273. [Python]두 수의 합

최근영 2023. 7. 25. 16:16

1. 문제

 

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

 

3273번: 두 수의 합

n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는

www.acmicpc.net

 

2. 접근 방법

 

  • 시간 제한: 1초
  • 메모리 제한: 128MB
  • 투 포인터
  • 정렬

 

3. 파이썬 코드

 

# N, num_list, x 값을 받는 부분
N = int(input())
num_list = list(map(int,input().split()))
x = int(input())
# num_list 를 탐색하기 위해서 오름차순 정렬
num_list.sort()
# 갯수 체크, 시작점, 끝점 체크
cnt = 0
start = 0
end = N-1
# start 값이 end 값보다 크면 탈출
while start < end:
    # answer 변수에 시작과 끝의 부분부터 탐색 시작
    answer = num_list[start] + num_list[end]
    # 만약 정답이 x보다 작으면 왼쪽 값을 1씩 증가
    if answer < x:
        start += 1
    # 정답이 x보다 크면 오른쪽 값을 1씩 감소
    elif answer > x:
        end -= 1
    # 정답인 경우 무한루프 탈출을 위해 큰값을 -1씩 후 cnt 증가
    else:
        cnt += 1
        end -=1
print(cnt)

 

4. 문제를 풀고난 후 생각

 

  • 리스트가 주어지고 그 값들을 탐색하며 기준 값에 맞는지 확인하는 문제로 투 포인터를 활용하여 값을 찾아 나가는 방식으로 문제를 해결했다.
  • 대부분의 두 값을 통해 목표값을 찾는 문제는 투포인터를 활용하여 해결했던 것 같다.
  • 시작과 끝을 정해둔 후 그 값들을 조건에 맞게 증가, 감소 시켜나가며 일치하는 값의 갯수를 체크해주면 한번의 반복문을 통해서 2개의 값을 선택해서 비교할 수 있어서 2중 반복문을 돌려 확인하는 것보다 시간이 훨씬 적게 소요된다.

 

5. 문제를 푸는데 도움이 되는 지식

 

  • 투 포인터
  • 정렬