본문 바로가기
📖 Coding Test/Baekjoon

[Swift] 백준 3273번 - 두 수의 합

by hyebin (Helia) 2023. 3. 26.
백준 문제 모음

문제 링크

https://www.acmicpc.net/problem/3273

 

3273번: 두 수의 합

n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는

www.acmicpc.net

 

문제

n개의 서로 다른 양의 정수 a1, a2,..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는 (ai, aj) 쌍의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 수열의 크기 n이 주어진다. 다음 줄에는 수열에 포함되는 수가 주어진다. 셋째 줄에는 x가 주어진다. (1 ≤ n ≤ 100000, 1 ≤ x ≤ 2000000)

출력

문제의 조건을 만족하는 쌍의 개수를 출력한다.

입출력 예시

알고리즘 분류

  • 정렬
  • 투 포인터

문제 풀이

  • 정수의 개수 n을 입력받고, 수열을 입력받아 정렬한 후 arr에 저장한다. 찾으려는 수 x도 입력받는다.
  • start는 0, end는 n-1로 초기값을 설정한다.
  • arr[start] + arr[end]가 x 라면, result를 1 증가시키고, start는 1 증가, end는 1 감소시킨다.
  • 더한 값이 x보다 작다면 start를 1 증가시키고,  아니라면 end를 1 감소시킨다.

소스코드

let n = Int(readLine()!)!
let arr = readLine()!.split(separator: " ").map{Int(String($0))!}.sorted()
let x = Int(readLine()!)!
var result = 0
var start = 0, end = n-1

while start < end {
    switch arr[start] + arr[end] {
    case x:
        result += 1
        start += 1
        end -= 1
    case ..<x:
        start += 1
    default:
        end -= 1
    }
}
print(result)
반응형

댓글