πŸ“– [λ°±μ€€μ•Œκ³ λ¦¬μ¦˜ 풀이] Q.3273 두 수의 ν•© 풀이 - java

πŸ“– 문제

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

n개의 μ„œλ‘œ λ‹€λ₯Έ μ–‘μ˜ μ •μˆ˜ a1, a2, …, an으둜 이루어진 μˆ˜μ—΄μ΄ μžˆλ‹€. ai의 값은 1보닀 ν¬κ±°λ‚˜ κ°™κ³ , 1000000보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.

μžμ—°μˆ˜ xκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, ai + aj = x (1 ≀ i < j ≀ n)을 λ§Œμ‘±ν•˜λŠ” (ai, aj)쌍의 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

πŸ” 접근법

Q.3273 두 수의 ν•© λ¬Έμ œμž…λ‹ˆλ‹€.

n개의 μ„œλ‘œ λ‹€λ₯Έ μ–‘μ˜ μ •μˆ˜λ“€λ‘œ 이뀄진 μˆ˜μ—΄μ΄ μžˆμ„ λ•Œ

ai + aj = x (1 ≀ i < j ≀ n)을 λ§Œμ‘±ν•˜λŠ” (ai, aj)쌍의 수λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

였직 λ‘κ°œμ˜ μˆ˜λ§Œμ„ 골라 xκ°’κ³Ό 같은 κ²½μš°κ°€ λͺ‡κ°œμΈ 지λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

투 포인터 λ°©μ‹μœΌλ‘œ 풀이가 κ°€λŠ₯ν•©λ‹ˆλ‹€.

μš°μ„  μˆ˜μ—΄μ„ 정렬을 ν•΄μ£Όκ³ 

μ‹œμž‘μ  = 0, 끝점 = n - 1 λΆ€ν„° 각각 μ‹œμž‘ν•΄ μ‹œμž‘μ κ³Ό 끝점이 같아지기 μ „κΉŒμ§€!

μ‹œμž‘μ κ³Ό 끝점의 μ›μ†Œλ₯Ό λ”ν•©λ‹ˆλ‹€.

ν•΄λ‹Ή 합이 x와 κ°™λ‹€λ©΄ countλ₯Ό 늘렀주고 start λ₯Ό 늘렀주고 endλŠ” μ€„μ—¬μ€λ‹ˆλ‹€.

주어진 n개의 μ •μˆ˜κ°€ λͺ¨λ‘ μ„œλ‘œ λ‹€λ₯Έ μ–‘μ˜ μ •μˆ˜μ΄λ―€λ‘œ

각 μˆ˜λ§ˆλ‹€ ν•œκ°œμ˜ μŒμ„ κ°€μ§ˆ 수 밖에 μ—†κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

ex) 1,2,3,4,5 κ°€ 주어지고 x=5 일 λ•Œ
1의 짝은 였직 4만 κ°€λŠ₯  1+4 = 5
2의 짝은 였직 3만 κ°€λŠ₯  2+3 = 5

ν•΄λ‹Ή 합이 x보닀 μž‘λ‹€λ©΄ 더 큰 수λ₯Ό λ”ν•΄λ΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— start 지점을 1 늘렀주고

λ°˜λŒ€λ‘œ 합이 x보닀 크닀면 합을 μ€„μ—¬μ€˜μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— end 지점을 1 μ€„μ—¬μ€λ‹ˆλ‹€.

start와 endκ°€ 같아지기 μ „κΉŒμ§€ 이λ₯Ό λ°˜λ³΅ν•˜λ©΄ 닡을 λ„μΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€.

while (start < end){
            int sum = sequence[start]+sequence[end];
            if(sum == x){       // sum이 x와 같은 경우
                start ++;
                end --;
                count++;
            }
            else if(sum < x ){  // sum이 x보닀 μž‘μ€ 경우
                start++;
            }  
            else{               //sum이 x보닀 큰 경우
                end--;
            }
}

πŸ’» μ½”λ“œ


package problem.twopointer;

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

public class Main_3273 {
    static int n,x;
    static int sequence[];
    static int count = 0;


    public static void main(String[] args) throws IOException {
        input();
        solve();
        System.out.println(count);
    }

    public static void solve(){
        int start = 0;
        int end = n-1;
        Arrays.sort(sequence);
        while (start < end){
            int sum = sequence[start]+sequence[end];
            if(sum == x){
                start ++;
                end --;
                count++;
            }
            else if(sum < x ){
                start++;
            }
            else{
                end--;
            }
        }
    }


    public static void input() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        sequence = new int[n];
        String temp[] = br.readLine().split( " ");
        for(int i=0; i<n; i++){
            sequence[i] = Integer.parseInt(temp[i]);
        }
        x = Integer.parseInt(br.readLine());
        br.close();
    }

}


Written on March 17, 2021