https://www.acmicpc.net/problem/3273
문제
n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는 (ai, aj)쌍의 수를 구하는 프로그램을 작성하시오.
나의 해결법
처음에는 단순히 이중 for문을 통해서 해결했다. 하지만 역시나 시간초과가 발생하였다.
n = int(sys.stdin.readline())
a = list(map(int, sys.stdin.readline().split()))
x = int(sys.stdin.readline()) # 목표값
for i in range(n):
for j in range(i+1, n):
if a[i] + a[j] == x:
cnt += 1
print(cnt)
그래서 두번째 방법 !
import sys
n = int(sys.stdin.readline())
a = list(map(int, sys.stdin.readline().split()))
x = int(sys.stdin.readline()) # 목표값
cnt = 0
left, right = 0, n-1
a.sort() # 먼저 정렬을 해줌
while left != right: # 왼쪽과 오른쪽이 만나지 않는 동안
if a[left] + a[right] == x: # 합이 목표값과 같으면 cnt 증가
cnt += 1
left += 1
elif a[left] + a[right] > x: # 합이 목표값보다 크면 오른쪽 인덱스를 -1
right -= 1
else: # 합이 목표값보다 작으면 왼쪽 인덱스를 + 1
left += 1
print(cnt)
'Algorithm > Sorting' 카테고리의 다른 글
[Python] 백준 10825번 국영수 (0) | 2023.10.27 |
---|---|
[Python] 백준 1920 수 찾기 (0) | 2022.06.02 |
[Python] 백준 10867 중복 빼고 정렬하기 (0) | 2022.06.02 |
댓글