본문 바로가기
알고리즘/백준

(백준/자바) 백준 3273번 문제 : 두 수의 합

by son_i 2023. 8. 6.
728x90

3273번: 두 수의 합 (acmicpc.net)

 

3273번: 두 수의 합

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

www.acmicpc.net

투포인터 개념 아예 다져버릴려고 문제 하나 더 풀어보기로 했다.

특정 target 값을 만족하는 경우의 수 구하는 문제

* 생각해야할 점 

 1. i < j 이므로 정렬하면 안 됨. 

 2. 단 두 수의 합이 target이 되어야 하므로 p1, p2 값을 그에 따라 조정. 

p1 < p2임에 유의 그 안에 어떤 쌍이든 가능한 것임. 인접한 것이 아니어도 됨.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.SQLOutput;
import java.util.StringTokenizer;

public class TwoPointer_03_2 {
    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 target = Integer.parseInt(br.readLine());
        int answer = 0;

        for (int i = 0; i < n; i++) {
            int p2 = i;
            long total = 0;

            while (p2 < n && total != target) {
                total += arr[p2++];
                if (total == target) {
                    answer++;
                    break;
                }
                total = arr[i];
            }
        }
        System.out.println(answer);
    }
}

1트 3%에서 틀렸다고 나옴.. 왜지

 

아니 이문제가 정렬을 해도 된다고 ????? 

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

public class TwoPointer_03_2 {
    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 target = Integer.parseInt(br.readLine());
        int answer = 0;

        Arrays.sort(arr);

        int p1 = 0;
        int p2 = n - 1;
        int total = 0;

        while (p1 < p2) {
            if (arr[p1] + arr[p2] < target) {
                p1++;
            } else if (arr[p1] + arr[p2] > target) {
                p2--;
            }

            if (arr[p1] + arr[p2] == target) {
                answer++;
                p1++;
                p2--;
            }

        }
        System.out.println(answer);
    }
}

정렬하고 정석대로 풀어서 맞았다..