1. 링크
https://www.acmicpc.net/problem/1253
2. 문제 설명
(1) 문제
N개의 수 중에서 어떤 수가 다른 수 두 개의 합으로 나타낼 수 있다면 그 수를 “좋다(GOOD)”고 한다.
N개의 수가 주어지면 그 중에서 좋은 수의 개수는 몇 개인지 출력하라.
수의 위치가 다르면 값이 같아도 다른 수이다.
(2) 입력
첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)
(3) 출력
좋은 수의 개수를 첫 번째 줄에 출력한다.
3. 코드
#1253
import sys
#입력 받기
N = int(sys.stdin.readline().strip())
A = list(map(int, sys.stdin.readline().split(' ')))
count = 0
A.sort()
#투 포인터
for k in range(N):
target = A[k]
i = 0
j = N - 1
while i < j:
if A[i] + A[j] == target:
if i != k and j != k:
count += 1
break
elif i == k:
i += 1
elif j == k:
j -= 1
elif A[i] + A[j] < target:
i += 1
else:
j -= 1
print(count)
4. 설명
투 포인터를 활용한 문제이다. 2018 수들의 합과 거의 비슷하지만, 주어진 N개의 수가 정렬되어 있지 않으니 sort해주어야 하고, target이 되는 수가 자기자신을 통해 스스로를 합한다면 (ex. [0, 1, 2, 3, 4, 5]에서 5를 만드는 방법은 0+5, 1+4, 2+3이 있다. 이 때 0+5는 5가 target 자기자신이므로 count되지 않는다.) 그 경우를 제외해야 하므로 그 부분만 유의해서 코드를 작성하면 된다.
5. 배운 점
처음으로 푼(?) 골드 문제다. 교재에 나와있고 비슷한 투 포인터 문제여서 답안을 참고하면서 풀었는데, 생각보다 간단한 풀이여서 놀랐다. 골드 쪽 문제도 슬슬 도전해봐야겠다는 생각이 들었다:)
'코딩테스트 > 백준' 카테고리의 다른 글
[백준 2164] 카드2 (0) | 2023.05.28 |
---|---|
[백준 2108] 통계학 (0) | 2023.05.21 |
[백준 2018] 수들의 합 (0) | 2023.05.14 |
[백준 1920] 수 찾기 (0) | 2023.05.02 |
[백준 10773] 제로 (0) | 2023.05.02 |