[백준 2470] 두 용액 (Java)
Algorithm/백준(BOJ)

[백준 2470] 두 용액 (Java)

반응형


[백준 2470] 두 용액 (Java)


출처 : 링크




쉽게 생각하고 접근하다 큰 코 다쳤다;;


조합 → 시간초과

이중for문 → 시간초과


N의 수를 잘 체크하고 문제를 푸는 습관을 갖자..




ArrayList에 값을 담고, Sort한다


처음 값과 끝 값의 합을 미리 저장해두고, while문을 통해 시작과 끝의 인덱스 값을 증감해가며 최소값을 찾아간다



문제 풀 때는 용액의 값이 크길래 long으로 선언해서 풀었는데 10억이라 int형으로 풀어도 상관 없을 것 같다



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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.StringTokenizer;
 
public class Main_2470 {
 
    static long N;
    static ArrayList<Long> arr;
    
    public static void main(String[] args) throws Exception {
        
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        N = Long.parseLong(br.readLine());
        arr = new ArrayList<>();
        
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        
        for (int i = 0; i < N; i++) {
            arr.add(Long.parseLong(st.nextToken()));
        }
        
        Collections.sort(arr); // 정렬
        
        long min = arr.get(0+ arr.get(arr.size()-1); // 가장 작은 값 + 가장 큰 값
        
        long s = 0// 시작
        long e = arr.size()-1// 끝
        
        long minI = s;
        long maxI = e;
        
        while(s < e) {
            
            long sum = arr.get((int) s) + arr.get((int)e);
            
            if(Math.abs(sum) < Math.abs(min)){
                minI = s;
                maxI = e;
                min = sum;
            }
            
            if(sum < 0) s++;
            else e--;
        }
        
        System.out.println(arr.get((int) minI) + " " + arr.get((int) maxI));
    }
    
}
 
cs


반응형