본문 바로가기
문제풀이/백준

[JAVA] 좋다 - 백준 1254번

by PhoB 2025. 5. 22.

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

 

내 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(input.readLine());
        StringTokenizer st = new StringTokenizer(input.readLine());
        int[] array = new int[n];

        for(int i = 0; i < n; i++){
            array[i] = Integer.parseInt(st.nextToken());
        }
        Arrays.sort(array);
        long answer = 0;
        for(int idx = 0; idx < n; idx++){ // 입력값만큼 반복
            int left = 0;
            int right = array.length - 1;
            int target = array[idx]; // 비교대상
            while(left < right){
                int tmp = array[left] + array[right];
                if(tmp == target){
                    if (left != idx && right != idx){
                        answer++;
                        break;
                    } else if (left == idx) {
                    // 포인터가 idx와 같아지면 틀릴수밖에 없다.
                        left++;
                    } else {
                        right--;
                    }
                } else if(tmp > target){
                // tmp가 target보다 크다면 너무 큰 수를 더한것
                    right--;
                } else{
                    left++;
                }
            }
        }
        System.out.println(answer);
    }
}

정렬과 투포인터를 사용하였다.

정렬 후 0번째 인덱스(가장 작은 값)와 맨 끝 인덱스(가장 큰값)을 더한 후 투포인터 방식대로 문제에서 요구하는 값을 찾아나가는 방식이다.

단, target의 인덱스가 투포인터의 인덱스에 겹치지 않도록 유의할 것.