<문제 링크>
https://www.acmicpc.net/problem/3273
<정답 코드>
sol 1 ) 배열에 인덱스 저장하고 값 비교해 계산
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
n = int(input())
arr = list(map(int, input().split()))
x = int(input())
arr2 = [0] * 2000000
for i in range(n):
arr2[arr[i]] = i
cnt = 0
for i in range(n):
if arr2[x - arr[i]] > i:
cnt += 1
print(cnt)
|
cs |
입력을 arr에 받고, 각 원소를 인덱스로 하는 arr2 배열에 인덱스를 저장했다.
정답이었지만, 문제를 잘못 이해한 풀이고,
메모리 사용(불필요하게 큰 arr2 배열) 측면에서 비효율적인 코드
시간복잡도 : O(n)
sol 2 ) 정렬과 투 포인터를 이용한 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
n = int(input())
arr = list(map(int, input().split()))
x = int(input())
# 배열 정렬 후 포인터 양쪽 끝에 두 개 설정
arr.sort()
left, right = 0, n - 1
cnt = 0
while left < right:
current_sum = arr[left] + arr[right]
if current_sum == x:
cnt += 1
left += 1
right -= 1
elif current_sum < x:
left += 1
else:
right -= 1
print(cnt)
|
cs |
두 개의 포인터(left, right)를 정렬한 배열 양 쪽 끝에 두고
합이 x와 일치할때까지 이동하며 해당하는 값을 찾는 코드
시간복잡도가 O(n log n)으로 1번 코드보다 약간 느리지만 훨씬 적은 메모리 공간 사용
1번 코드보다 깔끔한 풀이
'프로그래밍 > Python' 카테고리의 다른 글
백준_python 5397번 키로거 (스택, 연결리스트(LinkedList)) (0) | 2024.09.14 |
---|---|
백준_python 13549번 숨바꼭질 (메모리 초과, BFS, 최단거리) (0) | 2024.09.09 |
백준_python 1068번 트리 (DFS) (0) | 2024.08.23 |
백준_python 1991번 트리 순회 (Node class, 트리, 재귀) (0) | 2024.08.19 |
백준_python 9372번 상근이의 여행 (그래프, 트리) (0) | 2024.08.08 |