https://www.acmicpc.net/problem/1253
1253번: 좋다
첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)
www.acmicpc.net
시간복잡도 -> 제한시간이 2초이고 N의 개수가 2000입니다. (제한시간 2초면 연산 4천만번 가정)
만약 좋은수 하나를 찾는 알고리즘의 시간복잡도가 N^2 이라면
반복문을 돌리는데 총 N^3의 시간복잡도가 되므로 N^2 알고리즘은 사용할 수 없습니다.
따라서 NlogN의 시간복잡도 알고리즘을 사용해야합니다.
정렬후에 (파이썬 퀵소트 : NlogN)
투 포인터를 이용하면 가능합니다.
수를 입력받아 리스트에 저장후
투 포인터 start를 시작 인덱스로, end를 마지막 인덱스로 하여
좋은수가 될때까지 포인터의 범위를 줄여줍니다.
중요한 예외사항이 있는데
정렬된 데이터에서 자기 자신을 좋은 수 만들기에 포함하면 안됩니다 !!
내가 틀렸던 반례 )
11
0 1 2 3 4 5 6 7 8 9 10
답 : 8
소스코드
# 투 포인터
import sys
input = sys.stdin.readline
n = int(input())
arr = list(map(int, input().split()))
arr.sort()
cnt = 0
for i in range(n):
goal = arr[i]
start = 0
end = len(arr)-1
while start < end:
if arr[start] + arr[end] == goal:
if start == i:
start += 1
elif end == i:
end -= 1
else:
cnt += 1
break
elif arr[start] + arr[end] > goal:
end -= 1
elif arr[start] + arr[end] < goal:
start += 1
print(cnt)
'알고리즘 (Python)' 카테고리의 다른 글
백준 11286: 절댓값 힙 (파이썬 풀이) (0) | 2022.08.17 |
---|---|
22/08/08 백준하면서 간단한 기록 (0) | 2022.08.08 |
동전 바꿔주기(DFS) (0) | 2022.04.05 |
휴가(DFS) (0) | 2022.04.05 |
최대점수 구하기(DFS) (0) | 2022.04.04 |
댓글