본문 바로가기
Develop/백준 (Cpp)

[백준] 14921번 : 용액 합성하기 (C++)

by Tarra 2023. 8. 28.

14921번 : 용액 합성하기


문제)

홍익대 화학연구소는 다양한 용액을 보유하고 있다. 각 용액은 -100,000,000부터 100,000,000사이의 특성 값을 갖는데,

같은 양의 두 용액을 혼합하면, 그 특성값은 두 용액의 특성값의 합이 된다.

당신은 두 용액을 혼합하여 특성값이 0에 가장 가까운 용액을 만들려고 하는데, 각 용액은 10ml시험관에 10ml씩 들어있고, 빈 20ml 시험관이 단 하나 있다. 게다가 용액을 계량할 수 없어서, 두 용액을 섞을 때는 10ml씩 섞어서 20ml로 만드는데, 단 한번밖에 할 수 없다. 그래서 미리 용액의 특성값들을 보고, 어떤 두 용액을 섞을 것인지 정해야 한다.

예를 들어, 연구소에 있는 용액들의 특성값이 [-101, -3, -1, 5, 93]이라고 하자. 이 경우에 특성 값이 각각 -101, 93인 용액을 혼합하면 -8인 용액을 만들 수 있다. 또한 특성값이 5인 용액과 93인 용액을 혼합하면 특성 값이 98인 용액을 만들 수 있다. 모든 가능한 조합을 생각해 보면, 특성값이 2인 용액이 0에 가장 가까운 용액이다.

용액들의 특성값 A1, … ,AN이 오름차순으로 주어졌을 때, 이 중 두 개의 용액을 혼합하여 만들 수 있는 0에 가장 가까운 특성값 B를 출력하시오.

 

 

 

입력 :

N
A1 A2 … AN

 

 

 

출력 :

B

 

 

 

 

 

풀이)

 

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
#include <iostream>
#include <vector>
#include <climits>
 
using namespace std;
 
int main()
{
    int n;
    cin >> n;
 
    vector<int> vec;
    vec.resize(n);
 
    for (int& ele : vec) cin >> ele;
 
    int ans = INT_MAX;
 
    // 투 포인터 사용
    int s = 0;
    int e = n - 1;
 
    // s와 e는 겹쳐서는 안된다.
    while (s < e)
    {
        // 용액의 합을 구하기
        int value = vec[s] + vec[e];
 
        // value가 0보다 작다면 s를 오른쪽으로 밀어 
        // 0에 근접하도록 해준다
        if (value <= 0)
        {
            // 0에 얼마나 가까운지는 절대값을 이용하여 비교한다.
            if (abs(value) < abs(ans)) ans = value;
            s++;
        }
        // value가 0보다 크다면 e를 왼쪽으로 밀어 
        // 0에 근접하도록 해준다.
        else if (value > 0)
        {
            if (abs(value) < abs(ans)) ans = value;
            e--;
        }
    }
 
    cout << ans;
 
 
    return 0;
}
 
cs

출처 : https://www.acmicpc.net/problem/14921 

 

14921번: 용액 합성하기

홍익대 화학연구소는 다양한 용액을 보유하고 있다. 각 용액은 -100,000,000부터 100,000,000사이의 특성 값을 갖는데, 같은 양의 두 용액을 혼합하면, 그 특성값은 두 용액의 특성값의 합이 된다. 당신

www.acmicpc.net