[BAEKJOON] 백준 1059: 좋은 구간 (C#)

2024. 5. 26. 16:57IT/BaekJoon

문제 링크

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

 

 

 

문제

정수 집합 S가 주어졌을때, 다음 조건을 만족하는 구간 [A, B]를 좋은 구간이라고 한다.

  • A와 B는 양의 정수이고, A < B를 만족한다.
  • A ≤ x ≤ B를 만족하는 모든 정수 x가 집합 S에 속하지 않는다.

집합 S와 n이 주어졌을 때, n을 포함하는 좋은 구간의 개수를 구해보자.

 

 

입력

첫째 줄에 집합 S의 크기 L이 주어진다. 둘째 줄에는 집합에 포함된 정수가 주어진다. 셋째 줄에는 n이 주어진다.

 

 

출력

첫째 줄에 n을 포함하는 좋은 구간의 개수를 출력한다.

 

 

제한

  • 1 ≤ L ≤ 50
  • 집합 S에는 중복되는 정수가 없다.
  • 집합 S에 포함된 모든 정수는 1보다 크거나 같고, 1,000보다 작거나 같다.
  • 1 ≤ n ≤ (집합 S에서 가장 큰 정수)

 

 

 

통과한 답안

using System.Collections.Immutable;

namespace _1059
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int L = int.Parse(Console.ReadLine());
            int[] S = new int[L];

            string[] inputs = Console.ReadLine().Split(' ');
            for (int i = 0; i < L; i++)
            {
                S[i] = int.Parse(inputs[i]);
            }

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

            if (S.Contains(n))
            {
                Console.WriteLine(0);
                return;
            }

            Array.Sort(S);

            int lowerlawer = 0;
            int upperlawer = 1001;

            foreach (int number in S)
            {
                if (number < n)
                {
                    lowerlawer = number;
                }
                else if (number > n)
                {
                    upperlawer = number;
                    break;
                }
            }

            int cnt = 0;
            for (int A = lowerlawer + 1; A <= n; A++)
            {
                for (int B = n; B < upperlawer; B++)
                {
                    if (A < B)
                    {
                        cnt++;
                    }
                }
            }

            Console.WriteLine(cnt);
        }
    }
}

 

집합이 주어졌을 때, 그 집합에 속하지 않으면서

A <= n <= B를 만족하는 A와 B를 구하는 문제이다.

 

만약 n이 집합에 속하면 A와 B는 존재할 수 없으므로 0을 출력한다.

if (S.Contains(n))
{
    Console.WriteLine(0);
    return;
}

 

이후에 문제에서 주어진 조건인 S의 값은 1 ~ 1000을 이용하여

최저범위는 0으로 최고범위는 1001로 선언한 뒤에

각각의 원소에 대해서 실제 최저범위와 최고범위를 설정한다.

이를 통해서 n 값이 들어갈 수 있는 숫자의 범위가 생성된다.

 

int cnt = 0;
for (int A = lowerlawer + 1; A <= n; A++)
{
    for (int B = n; B < upperlawer; B++)
    {
        if (A < B)
        {
            cnt++;
        }
    }
}

 

이후에 위와 같은 코드를 통해서

최저범위보다 1 크면서 n과 최고범위 사이의 숫자들을 하나씩 더한다.

이를 통해서 A와 B의 범위를 카운팅할 수 있다.