ALGORITHM/BOJ

[백준] 3273 두 수의 합

0298 2022. 7. 25. 13:54

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

2022-07-25


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.util.Arrays;
import java.util.Scanner;
 
public class Main3273 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
 
        int[] arr = new int[n];
        for(int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }
        int x = sc.nextInt();
 
        int start = 0;
        int end = n-1;
        int answer = 0;
 
        Arrays.sort(arr);
 
        while(start < end) {
            if(arr[start] + arr[end] > x) end--;
            else if(arr[start] + arr[end] == x) {
                answer++;
                end--;
            } else start++;
        }
 
        System.out.println(answer);
    }
}
cs

 

#문제풀이

투 포인터로 풀지 않아도 되겠지만 투 포인터로 풀었다.

양끝에서 포인터를 좁혀가면서 A[i] + A[j] = x인 모든 경우를 찾는 문제 (더 쉬운 방법이 있지만, 연습을 위해 투 포인터를 써봅시다.)

 

오름차순으로 정렬 한 후 양 끝 (start, end)에서 해당 인덱스 값의 배열 값들의 합이 더 크거나 같으면 end인덱스 값을 한 칸 줄이고 작으면 start 인덱스 값을 한 칸 올렸다