코테/백준

[백준/JAVA] 2470번: 두 용액

imname1am 2023. 7. 20. 20:53
반응형

🔺 문제

 

2470번: 두 용액

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

www.acmicpc.net

 

 

🔺 코드

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
import java.util.*;
import java.io.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int N = Integer.parseInt(br.readLine());
        
        long[] A = new long[N];
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        for(int i = 0 ; i < N ; i++) {
            A[i] = Long.parseLong(st.nextToken());
        }
        
        Arrays.sort(A);    // 🔔 투 포인터 실행 전 정렬 필수!
        
        // 투 포인터
        long gap = Integer.MAX_VALUE;
        
        int s = 0;
        int e = N - 1;
        
        long ans1 = 0;
        long ans2 = 0;
        
        while(s < e) {
            long sum = A[s] + A[e];
            long absSum = Math.abs(sum);
            
            if(absSum < gap) {
                gap = absSum;
                ans1 = A[s];
                ans2 = A[e];
            }   
                
            if(sum < 0) {
                s++;
            }
            else {
                e--;
            }
        }
 
        System.out.println(ans1 + " " + ans2);
    }
}
 
cs
✅ 해결 아이디어
✔ 투 포인터 (시간 복잡도 : O(N))

 

💥 유의사항

• 완전탐색으로 했다간 크기 때문에 시간 초과 뜬다...

 

 


🔺 다른 풀이들

- 이진 탐색 활용한 풀이

 

[ baekjoon ] 두 용액 2470번 ( Java )

문제 https://www.acmicpc.net/problem/2470 2470번: 두 용액 첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고

yanoo.tistory.com


💬 느낀 점

이진 탐색이랑 투 포인터랑 머릿속에서 약간 섞여서 혼란스러웠다(?)

 

 

 

1회독 2회독 3회독 4회독 5회독
V 12.2 240222    

 

 

(+12.2 2회독)

입력받은 값을 절댓값 기준 오름차순 정렬하고, (O(NlogN))

현재 값과 다음 값의 특성값을 구한다.

이 값이 기준 특성값보다 작다면 기준 특성값을 갱신하고, 정답도 갱신한다.

 

특성값도 배열로 받아 오름차순으로 정렬 후 출력한다.

 
코드 확인하기
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
import java.util.*;
import java.io.*;
 
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int N = Integer.parseInt(br.readLine());
        Liquid[] arr  = new Liquid[N];
        
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        for(int i = 0 ; i < N ; i++) {
            arr[i] = new Liquid(Integer.parseInt(st.nextToken()));
        }
        Arrays.sort(arr);   // 사용자 정의 정렬
        
 
        int[] answer = new int[2];
        int diff = Integer.MAX_VALUE;
        
        for(int i = 0 ; i < N - 1 ; i++) {
            if(Math.abs(arr[i].val + arr[i + 1].val) < diff) {
                answer[0= arr[i].val;
                answer[1= arr[i + 1].val;
                
                diff = Math.abs(arr[i].val + arr[i + 1].val);
            }
        }
        
        Arrays.sort(answer);    // 특성값 오름차순 정렬
        System.out.println(answer[0+ " " + answer[1]);
        
    }
}
 
class Liquid implements Comparable<Liquid> {
    int val;
    
    public Liquid(int val) {
        this.val = val;
    }
    
    // 절댓값 기준 오름차순 정렬
    @Override
    public int compareTo(Liquid o) {
        return Math.abs(this.val) - Math.abs(o.val);
    }
}
 
cs


(참고)

 

[알고리즘] 백준 2470 두 용액 -투포인터- 자바

www.acmicpc.net/problem/2470 2470번: 두 용액 첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다.

youngest-programming.tistory.com

 

반응형