알고리즘/백준

[파이썬] BOJ_3273(두 수의 합)

딱따구르리 2023. 6. 12. 20:29
728x90
반응형

 

 

 

문제

 

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


 

해설

 

반응형

 

처음에는 밑의 주석처리 된 시간 초과 코드 처럼 풀면 쉽게 해결될 거라고 생각했다.

그치만 이중 반복문을 쓰면 시간복잡도가 O(n^2)이 되어 시간 초과가 난다.

 

이 문제는 투포인터 문제로 리스트의 가장 처음(0)과 가장 마지막(n-1)을 각각 포인터로 설정해

위치를 옮겨가면서 원하는 값을 구하면 된다.

left 위치와 right 위치를 더한 값을 temp에 저장하고

temp가 x와 같다면 만족하는 쌍을 찾은 것이므로 cnt를 +1

left는 right보다 무조건 작은 값인데 둘을 더한 temp가 x보다 작다면 left를 오른쪽으로 한 칸 옮겨

더 큰 값을 넣어 더해준다.

반대로 temp가 x보다 크면 right를 왼쪽으로 한 칸 옮겨 더 작은 값을 넣어 더해주면 된다.

 

 


코드

 

-파이썬

#백준 3273(두 수의 합)
import sys
input = sys.stdin.readline
n = int(input())  #수열의 크기
num = [*map(int, input().split())]  #수열
num.sort()
x = int(input())
cnt = 0

# for i in range(n):  #시간 초과 코드
#     for j in range(i+1, n):
#         if num[i] + num[j] == x:
#             cnt += 1
#
# print(cnt)

left , right = 0, n-1
while left < right:
    temp = num[left] + num[right]
    if temp == x:
        cnt += 1
    if temp < x:
        left += 1
        continue
    right -= 1
print(cnt)

 

 

 

728x90
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[파이썬] BOJ_10448(유레카 이론)  (0) 2023.06.24
[파이썬] BOJ_4963(섬의 개수)  (0) 2023.06.15
[파이썬] BOJ_2605(줄 세우기)  (0) 2023.06.11
[파이썬] BOJ_2810(컵홀더)  (0) 2023.06.09
[파이썬] BOJ_2798(블랙잭)  (0) 2023.06.01