개발 연습장/백준 문제풀이

[파이썬, Python] 백준 3273: 두 수의 합

LooanCheong 2023. 7. 4. 10:52
반응형

문제

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

코드

import sys
input = sys.stdin.readline

n = int(input())
nums = sorted(list(map(int, input().split())))
x = int(input())

cnt = 0
start = 0
end = n - 1

while start < end:
    inter_sum = nums[start] + nums[end]
    
    if inter_sum == x:
        cnt += 1
        start += 1
    elif inter_sum > x:
        end -= 1
    else:
        start += 1

print(cnt)

설명

투 포인터의 개념을 이용해서 문제를 풀이했다.

우선 받은 수를 정렬해서 투 포인터를 사용할 수 있게 해 준다.
그리고 시작 지점과 끝 지점의 인덱스를 지정해 준다.
시작의 경우 0으로 끝 지점의 경우 n-1로 지정했다.

시작 지점이 끝 지점보다 커지기 전까지 반복하며
각 인덱스를 가진 수를 더해서 목푯값과 같은지 확인한다.

만약 목푯값보다 크다면 end를 1 줄여서 더 작은 값을 더할 수 있게 한다.
목표값보다 작다면 start를 1 늘려서 더 큰 값을 더할 수 있게 한다.
만약 목푯값과 일치한다면 카운트를 1 늘려주고 start를 1 늘려서 계산한다.(end를 줄여도 상관없다.)

최종적으로 카운트된 값을 출력한다.

반응형