문제

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

+ Recent posts