하루하루 꾸준히, 인생은 되는대로

알고리즘

백준 14921 C언어

긤효중 2022. 2. 25. 12:22

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

 

14921번: 용액 합성하기

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

www.acmicpc.net


문제

홍익대 화학연구소는 다양한 용액을 보유하고 있다.  각 용액은 -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에 가장 가까운 용액이다.

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


입력

N
A_1 A_2 … A_N
  • 2 <= N <= 100,000
  • -100,000,000 <=A_i<=100,000,000
  • A_(i-1) <= A_i <= A_(i+1)

출력

B

해결방안 -> 정렬 후 투포인터 초기값을 0,배열의 끝으로 설정한후 Min변수를 200000000으로 설정

배열[left] + 배열[right]가 < 0이면 l++ (이때 배열[left] + 배열[right]의 절대값이 Min보다 작다면 Min변수 갱신)

배열[left] + 배열 [right]가 >0이면 r--(이때 배열 [left] + 배열[right]의 절대값이 Min보다 작다면 Min갱신)

sum < 0이면 is_not_plus = 1,

sum > 0이면 is_not_plus = 0

 

루프가 끝나고 is_not_plus가 1이면 -Min출력\

0이면 Min출력


전체 소스 코드->

#include <stdio.h>
#include <stdlib.h>

//백준 용액합성하기(14921)
 
int compare(const void *a,const void *b){
    int num1 = *(int *)a;
    int num2 = *(int *)b;
    if(num1 > num2){
        return 1;
    }
    else if(num1 < num2){
        return -1;
    }
    else{
        return 0;
    }
}
int main(void){
    int arr[100000];
    int n;
    scanf("%d",&n);
    for(int i = 0;i<n;i++){
        scanf("%d",&arr[i]);
    }
    qsort(arr,n,sizeof(int),compare);
 
    int is_not_plus = 0;
 
    int l = 0;
    int r = n-1;
    long long sum = 0;
    long long min = 200000001;
    while(l<r && r<n){
        sum = arr[l] + arr[r];
        if(sum < 0){
            l++;
            if(llabs(sum) < min){
                min = llabs(sum);
                is_not_plus = 1;
            }
        }
        else if(sum > 0){
            r--;
            if(llabs(sum) < min){
                min = llabs(sum);
                is_not_plus = 0;
            }
        }
        else if(sum == 0){
            min = 0;
            break;
        }
 
    }
    if(is_not_plus == 1){
        long long Min = -min;
        printf("%lld",Min);
    }
    else if(is_not_plus == 0){
        printf("%lld",min);
    }
 
}

'알고리즘' 카테고리의 다른 글

백준 1946 신입사원 C언어  (0) 2022.02.28
백준 6550 C언어  (0) 2022.02.26
백준 1316 C언어  (0) 2022.02.23
백준 14905 C언어  (0) 2022.02.20
백준 1475 C언어  (0) 2022.02.19