[백준/BOJ][Python] 3273번 두 수의 합
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년 전 C++로 풀다가 시간 초과, 1년 전 python으로 풀다가 시간초과나서 묵혀뒀던 문제이다
(사실 3일 전에 풀었는데 이제야 올린다..ㅎ)
문제는 정말 간단하다. 배열 주어지고 x가 주어졌을 때 배열에서 합이 x가 되는 쌍의 개수를 구하면 된다.
근데 시간 초과인 이유는 이중for문으로 O(n^2) 대충 n의 최댓값은 100,000이니까 n^2이면 10,000,000,000 ㄷㄷ
암튼 투포인터로 풀면 간단하게 풀 수 있다.
처음에 투포인터라고 해서 이름이 무서워서 두려웠는데 C언어의 그 포인터가 아니었다ㅋㅋㅋ
그냥 인덱스 2개로 움직이는 것이다
이 문제는 맨 처음 인덱스(start), 맨 마지막 인덱스(end)로 정하고
둘의 합이 주어진 x보다 크면 start 인덱스를 오른쪽으로 (+1) 작으면 end 인덱스를 왼쪽으로 (-1) 움직이면 된다.
만약 합이 x가 나왔다면 cnt + 1 하면 끝!!!
+) 그냥 갑자기 함수로 풀고 싶어서 함수로 풀었다
코드
import sys
input = sys.stdin.readline
n = int(input())
arr = list(map(int, input().split()))
x = int(input())
start = 0
end = len(arr) - 1
cnt = 0
arr.sort()
def Two_pointer(x):
start = 0
end = len(arr) - 1
cnt = 0
while start < end:
sum = arr[start] + arr[end]
if sum == x:
cnt += 1
if sum <= x:
start += 1
else:
end -= 1
return cnt
print(Two_pointer(x))
sort()가 O(nlogn)이기 때문에 이 코드의 시간 복잡도는 O(nlogn)
'Algorithm > 알고리즘 문제' 카테고리의 다른 글
[백준/BOJ][Python] 16953번 A → B (1) | 2023.11.30 |
---|---|
[백준/BOJ][Python] 11728번 배열 합치기 (0) | 2023.11.30 |
[백준/BOJ][Python] 1744번 수 묶기 (0) | 2023.11.30 |
[백준/BOJ][Python] 12847번 꿀 아르바이트 (0) | 2023.11.25 |
[백준/BOJ][Python] 23827번 수열 (Easy) (1) | 2023.11.25 |