1. 문제

14921번: 용액 합성하기



2. 개요

특성값이 -10,000,000이상 10,000,000이하인 용액들이 있다.

이 용액들 중 두 가지를 섞어 합성값이 가장 0에 가까운 합성 용액을 만들려고 한다.

용액들의 특성값이 오름차순으로 주어졌을 때, 만들 수 있는 가장 0에 가까운 합성값을 구하는 문제.



3. 풀이 및 코드

3-1. 풀이

두 포인터 l, r을 각각 최솟값과 최댓값으로 잡는다.

두 포인터의 인덱스의 값을 더한 값이 음수라면 최댓값을 낮춰야 0에 가까워지므로 r을 1씩 줄인다.

반대로 양수라면 최솟값을 높여줘야 0에 가까워지므로 l을 1씩 늘린다.

합성값의 절댓값이 지금까지 만든 가장 0에 가까운 합성값의 절댓값보다 작다면 갱신한다.

이를 합성값이 딱 0이 되거나 l이 r이상이 될 때까지 반복한 뒤, 답을 출력한다.

3-2. Python

import sys

N = int(sys.stdin.readline())

A = list(map(int, sys.stdin.readline().split()))

l, r = 0, N - 1
closest = 200000000

while l < r:
    B = A[l] + A[r]

    if B == 0:
        closest = B
        break

    elif B < 0:
        l += 1

    else:
        r -= 1

    if abs(B) < abs(closest):
        closest = B

print(closest)

3-3. C#

namespace boj_14921
{
    internal class Program
    {
        static void Main(string[] args)
        {
            StreamReader sr = new (Console.OpenStandardInput());
            StreamWriter sw = new (Console.OpenStandardOutput());

            int N = int.Parse(sr.ReadLine());
            int[] A = Array.ConvertAll(sr.ReadLine().Split(), int.Parse);

            int l = 0;
            int r = N - 1;
            int closest = int.MaxValue;

            while (l < r)
            {
                int B = A[l] + A[r];

                if (B == 0)
                {
                    closest = B;
                    break;
                }

                else if (B < 0)
                    l++;

                else
                    r--;

                if (MathF.Abs(B) < MathF.Abs(closest))
                    closest = B;
            }

            sw.WriteLine(closest);
            sw.Close();
        }
    }
}

Comments