본문 바로가기

알고리즘 자료구조/백준

[백준] P.3273 두 수의 합

728x90

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)

 

출력

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

 

🖊️문제 풀이

이 문제도 몇일 전에 풀었던 투포인터 문제처럼 풀어주었다.

내일 모레까지 투포인터 문제 2개만 더 풀고 다른 알고리즘으로,,

 

🖊️코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class P3273 {

  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    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());
    }

    int x = Integer.parseInt(br.readLine());

    Arrays.sort(arr);
    int left = 0;
    int right = n-1;
    int count = 0;
    while (left<right){
      int sum = arr[left]+arr[right];
      if(sum == x){
        count++;
        left++;
        right--;
      }else if(sum > x){
        right--;
      }else {
        left++;
      }
    }

    System.out.println(count);
  }

}
728x90

'알고리즘 자료구조 > 백준' 카테고리의 다른 글

[백준] P.2230 수 고르기  (1) 2024.03.07
[백준] P1806 부분합  (1) 2024.03.06
[백준] P2559 수열  (0) 2024.03.04
[백준] P2003 수들의 합2  (0) 2024.03.03
[백준] P2606 바이러스  (0) 2024.03.01