20240513_C#에서 숫자 표기 관련

2024. 5. 13. 13:50IT/TIL

오늘의 TIL은 C#에서 연산을 하는 과정에서 숫자를 표기하는 것과 관련된 내용이다.

 

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


백준 알고리즘 문제 1964번 오각형, 오각형, 오각형… 문제를 푸는 과정에서 겪은 내용인데

 

 

위와 같이 각 단계마다 5각형의 꼭지점을 찍어나갈 때,

각 단계의 점의 개수를 묻는 문제이다.

 

이 문제의 일반항을 구해보면

a1 = 5
a2 = 12
a3 = 22
a4 = 35
a5 = 51
a6 = 70

 

위와 같은 방식으로 점의 개수가 늘어나고

공차가 등차수열인 수열인 것을 알 수 있다.

이를 가지고 일반항을 구하면 아래와 같이 표기할 수 있다.

 

이를 풀면

와 같이 일반항을 구할 수 있다.

 

따라서 코드를 작성하면 아래와 같이 작성할 수 있다.

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

            long answer = (3 * n * n + 5 * n + 2) / 2 % 45678;
            Console.WriteLine(answer);
        }
    }
}

 

문제에서 점의 개수를 45678로 나눈 나머지를 구해야 하므로 % 45678이 추가되었다.

또, N의 최댓값은 10,000,000이므로 int의 범위를 초과할 수 있으므로

long answer를 사용하였다.

 

그런데 이 코드가 수학적으로는 문제가 없으나 C#에서는 문제가 생길 수 있다.

int의 범위과 관련된 내용으로 n을 int로 정의했으므로,

3 * n * n은 int들의 곱셈으로 결괏값이 int로 표기되야한다.

따라서 n은 int의 범위 내에 있더라도 이 결괏값이 int의 범위를 초과하는 문제가 발생한다.

 

이를 해결하기 위해서는 3 * n * n의 곱셈의 결괏값이 long으로 출력되게 해야한다.

이 때, n을 long으로 받아와도 되지만,

입력값의 범위가 int의 범위이므로 이는 적절하지 않다고 판단했다.

 

따라서 3을 long타입으로 사용하기 위해 아래와 같이 코드를 수정하였다.

long answer = (3L * n * n + 5 * n + 2) / 2 % 45678;

 

3L으로 표기하는 것으로 3을 int가 아닌 long 으로 표기할 수 있었다.

 

 

정리하면

C#에서 숫자들의 연산은 해당 숫자들의 형식을 따라가므로

해당 형식의 범위를 초과할 것으로 예측되면 숫자에 L을 붙이는 것으로 해결할 수 있다.