본문 바로가기
자바 알고리즘

백준 3273 : 두 수의 합

by hoshi03 2024. 12. 1.

문제

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)

출력

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

예제 입력 1 복사

9
5 12 7 10 9 1 2 3 11
13

예제 출력 1 복사

3

 

• 풀이

 

전형적인 투 포인터, 정렬 후 양 끝에서 가운데로 오면서 탐색하는 구조 

중복되는 숫자도 없어서 오름차순 정렬 후 투포인터로 풀렸다

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int n = Integer.parseInt(br.readLine());
        int[] arr = new int[n];
        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++)arr[i] = Integer.parseInt(st.nextToken());
        Arrays.sort(arr);
        int target = Integer.parseInt(br.readLine());
        int lt = 0, rt = n-1, cnt = 0;
        while (lt < rt){
            int tmp = arr[lt]+arr[rt];
            if (tmp == target){
                rt--;
                lt++;
                cnt++;
            }
            else if (tmp < target) lt++;
            else rt--;
        }
        System.out.println(cnt);
    }
}

'자바 알고리즘' 카테고리의 다른 글

빠른 입출력 실험하기(버퍼리더 + 스트링빌더)  (0) 2024.12.17
백준 10431 : 줄세우기  (0) 2024.12.01
백준 2644 : 촌수계산  (0) 2024.04.10
그래프 문제일때 생각해볼 것  (0) 2024.04.07
등수구하기  (0) 2024.01.13