1. 문제

3273번: 두 수의 합



2. 개요

n개의 서로 다른 양수로 이루어진 수열이 있다.

자연수 x가 주어졌을 때 이 수열에서 ai + aj = x 를 만족하는 ai, aj순서쌍의 개수를 구하는 문제.



3. 풀이 및 코드

3-1. 풀이

먼저 수열을 오름차순 정렬한다.

두 포인터 l, r을 각각 수열의 양 끝 값으로 잡는다.

두 포인터의 값의 합이 x라면 답을 1만큼 늘리고 l, r 을 각각 1씩 늘리고 줄인다.

x 미만이라면 l을 1 늘리고, x 초과라면 r을 1 줄인다.

이를 l 이 r 이상이 될 때 까지 반복해서 진행한다.

반복이 끝났다면 답을 출력한다.

3-2. Python

import sys

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

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

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

nums.sort()

l, r = 0, n-1
answer = 0

while l < r:
    if nums[l] + nums[r] == x:
        l += 1
        r -= 1
        answer += 1

    elif nums[l] + nums[r] < x:
        l += 1

    else:
        r -= 1

print(answer)

3-3. C#

namespace boj_3273
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int n = int.Parse(Console.ReadLine());

            int[] nums = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);

            int x = int.Parse(Console.ReadLine());

            Array.Sort(nums);

            int answer = 0;
            int l = 0;
            int r = n - 1;

            while (l < r)
            {
                if (nums[l] + nums[r] == x)
                {
                    l++;
                    r--;
                    answer++;
                }

                else if (nums[l] + nums[r] < x)
                    l++;

                else
                    r--;
            }

            Console.WriteLine(answer);
        }
    }
}

Comments