Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
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
Archives
Today
Total
관리 메뉴

전공공부

[BOJ_2470] 두 용액 본문

Study/Problem Solving

[BOJ_2470] 두 용액

monitor 2023. 11. 12. 11:51

설명


어짜피 두개만 선택하는 경우의 수이고 이것을 모두 비교하면서 진행하는 백 트레킹 방식을 진행하기에는 100000C2 50억이므로 불가능 그래서 투포인터 방식을 사용해서 진행하는데 이때, 오름 차순으로 정렬 후 선택하게 되면 결국 앞에서 나가는 것은 무조건 음수에서 양수로 나아가는 방식이고 이를 토대로 start, end 조건을 걸어서 풀면 된다. 

 

 

코드


package two_pointer;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;

public class BOJ_2470 {
    public static void main(String[] args) throws Exception{
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer tk = new StringTokenizer(in.readLine()," ");
        int N = Integer.parseInt(tk.nextToken());
        tk = new StringTokenizer(in.readLine()," ");
        List<Integer> list = new ArrayList<>();

        for(int i = 0; i < N; i++){
            list.add(Integer.parseInt(tk.nextToken()));
        }
        Collections.sort(list); //오름 차순 정렬

        int start = 0;
        int end = N - 1;
        int ans_start = 0;
        int ans_end = 0;
        int min = Integer.MAX_VALUE;
        while (start < end){
            //0보다 작으면 start 상승시켜서 다음 수로 비교해보면 됨
            if(list.get(start) + list.get(end) < 0){
                if(Math.abs(list.get(start) + list.get(end)) < Math.abs(min)){
                    ans_start = start;
                    ans_end = end;
                    min = list.get(start) + list.get(end);
                }
                start++;
            } else if (list.get(start) + list.get(end) > 0) {
                if(Math.abs(list.get(start) + list.get(end)) < Math.abs(min)){
                    ans_start = start;
                    ans_end = end;
                    min = list.get(start) + list.get(end);
                }
                end--;
            }else{
                ans_start = start;
                ans_end = end;
                break;
            }
        }
        System.out.println(list.get(ans_start) + " " + list.get(ans_end));
    }
}
 

2470번: 두 용액

첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 1,000,00

www.acmicpc.net

 

'Study > Problem Solving' 카테고리의 다른 글

[BOJ_3151] 합이 0  (1) 2023.11.14
[BOJ_22862] 가장 긴 짝수 연속한 부분 수열 (large)  (0) 2023.11.13
[BOJ_20922] 겹치는 건 싫어  (1) 2023.11.11
[BOJ_21921] 블로그  (0) 2023.11.08
[BOJ_11728] 배열 합치기  (0) 2023.11.07