문제
N개의 수 중에서 어떤 수가 다른 수 두 개의 합으로 나타낼 수 있다면 그 수를 “좋다(GOOD)”고 한다.
N개의 수가 주어지면 그 중에서 좋은 수의 개수는 몇 개인지 출력하라.
수의 위치가 다르면 값이 같아도 다른 수이다.
입력
첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)
출력
좋은 수의 개수를 첫 번째 줄에 출력한다.
내가 푼 풀이
- N개의 수를 순회하면서 투포인터 알고리즘으로 합이 같은지 찾았다.
- 투포인터 알고리즘을 사용하기 전에 A정렬을 오름차순으로 정렬후, start: 첫번째 end: 마지막번째 위치로 이용했다.
- 합산한 값이 크다면 end를 줄이고, 작다면 start를 늘려 찾고, 같은 인덱스(같은원소인경우) 패스했다.
import Foundation
// 입력받기
let N = Int(readLine()!)!
var A = readLine()!.split(separator: " ").map{Int(String($0))!}
var count = 0
A.sort()
for i in 0..<N {
var num = A[i]
var start = 0
var end = A.count - 1
// 투포인터 알고리즘을 이용
// 합산한 값이 작다면 start + 1
// 합산한 값이 크다면 end - 1
while start < end {
if start == i {
start += 1
continue
} else if end == i {
end -= 1
continue
}
let sum = A[start] + A[end]
if sum == num {
count += 1
break
}
if sum > num {
end -= 1
} else {
start += 1
}
}
}
print(count)
'코딩테스트 > 백준' 카테고리의 다른 글
BOJ-1013 Contact Swift (0) | 2024.04.15 |
---|---|
BOJ-5430 AC Swift (1) | 2024.04.15 |
BOJ-5052 전화번호 목록 Swift (0) | 2024.04.14 |
BOJ-2470 두 용액 Swift (0) | 2024.04.14 |
BOJ-14503 로봇 청소기 Swift (0) | 2024.04.13 |