굉장히 쉬운 문제다. 그냥 입력을 받고 더해준 다음 부호를 확인해주고 출력하면 된다. BigInteger 형식을 쓴다면 말이다. 그렇게 쉽게 풀었다.
using System;
using System.Numerics;
class Program
{
static void Main()
{
var n = new int();
var b = new BigInteger();
for(int i = 0; i < 3; i++)
{
b = 0;
n = int.Parse(Console.ReadLine());
for(int j = 0; j < n; j++)
{
b += BigInteger.Parse(Console.ReadLine());
}
Console.WriteLine(b > 0 ? "+" : b < 0 ? "-" : "0");
}
}
}
그런데 이상한 일이 생겼다. 내 코드보다 속도가 두배나 빠른 풀이들이 있는 것이다. 나는 다른 사람들의 풀이를 가능하면 안보려고 하지만 너무 궁금해서 열어봤다. 대체 무슨 코드를 썼길래 이것보다 더 빠를 수 있는걸까.
내 코드는 이렇다.
1. 입력을 곧장 BigInteger.Parse( ) 메소드로 변환시킨다.
2. 변환한 값을 BigInteger 변수에 더해준다.
이것보다 더 짧게 줄일 수는 없을 것 같다.
다른 사람들의 코드는 이렇다.
1. 입력을 일단 string으로 받는다.
2. long.Parse( ) 메소드로 string을 long으로 변환시킨다.
3. long 값을 BigInteger 변수에 옮겨 담는다.
4. 기존의 BigInteger 에 새로 담은 BigInteger을 더해준다.
뭘까. 불필요한 과정이 있는 것 같지만 난 이 방법을 따라서 코드를 작성해봤다.
using System;
using System.Numerics;
class Program
{
static void Main()
{
var n = new int();
var l = new long();
var b = new BigInteger();
var ans = new BigInteger();
for(int i = 0; i < 3; i++)
{
ans = 0;
n = int.Parse(Console.ReadLine());
for(int j = 0; j < n; j++)
{
string s = Console.ReadLine();
l = long.Parse(s);
b = l;
ans += b;
}
Console.WriteLine(ans > 0 ? "+" : ans < 0 ? "-" : "0");
}
}
}
이게 무슨... 앞서 작성한 코드의 걸린 시간은 416ms, 풀이를 보고 다시 작성한 코드의 걸린 시간은 204ms다.
심지어 메모리도 전자는 19988KB, 후자는 18492KB다. 뭐지? BigInteger.Parse( ) 메소드에 불필요한 과정을 건너뛰는 숏컷이라도 되는건가? 혼란스러워... 아무튼 왜인지 모르지만 결론은
BigInteger 형식을 다룰 때에는 대체 가능한 경우,
string을 그대로 Parse하는 것보다 long으로 변환하고 BigInteger 로 옮기는 것이 효율적이다.