백준

1253 - 좋다 (Java)

whiporithm 2024. 10. 1. 20:08

 


 

문제

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

 

풀이

투 포인터를 활용해서 풀어야하는 문제이다.

 

값을 오름차순 정렬한다음, 가장 앞과 가장 뒤에 포인터를 위치시킨다.

 

포인터에 위치한 두 값을 더한 값이,

 

내가 선택한 값보다 크다면 -> 뒤의 포인터를 줄인다.

내가 선택한 값보다 작다면 -> 앞의 포인터를 늘린다.

 

포인터를 이동할 때 선택한 숫자는 선택이 안되야하므로 이 부분은 예외처리 해주면 된다.

 

코드

import java.util.*;
import java.io.*;
import java.util.stream.Collectors;

public class Main {


    public Integer solution() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int answer = 0;
        List<Integer> numbers = new ArrayList<>(Arrays.asList(br.readLine().split(" ")))
                .stream()
                .map(Integer::parseInt)
                .sorted()
                .collect(Collectors.toList());

        if(n < 3) return answer;


        for (int i = 0; i < n; i++) {
            int front = 0;
            int back = n-1;

            while (true) {

                // 투 포인터를 설정한다.
                if(front == i) front++;
                if(back == i)  back--;

                if(front == back) break;

                int result = numbers.get(front) + numbers.get(back);
                int target = numbers.get(i);

                if(result == target){
                    answer++;
                    break;
                }

                if(result > target) back--;
                if(result < target) front++;
            }
        }
        return answer;
    }

    public static void main(String[] args) throws Exception {
        System.out.println(new Main().solution());
    }
}

 

후기

 

풀고보면 단순한 투 포인터인데 놓칠부분이 은근 있는듯하다,,

'백준' 카테고리의 다른 글

2295 - 세 수의 합 (Java)  (2) 2024.10.03
2493 - 탑 (Java)  (0) 2024.10.01
20955 - 민서의 응급 수술 (Java)  (0) 2024.10.01
1079 - 쇠 막대기 (Java)  (0) 2024.09.26
2116 - 주사위 쌓기 (Java)  (1) 2024.09.23