2024. 5. 13. 13:50ㆍIT/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을 붙이는 것으로 해결할 수 있다.
'IT > TIL' 카테고리의 다른 글
20240521_평행사변형(백준 1894: 4번째 점 (C#)) (0) | 2024.05.21 |
---|---|
20240511_택시 기하학 (0) | 2024.05.11 |
20240402_StringBuilder (0) | 2024.04.02 |
20240329_금과 은 운반하기(프로그래머스) (1) | 2024.03.30 |
20240328_A로 B 만들기(프로그래머스) (0) | 2024.03.28 |