1247번: 부호

총 3개의 테스트 셋이 주어진다. 각 테스트 셋의 첫째 줄에는 N(1 ≤ N ≤ 100,000)이 주어지고, 둘째 줄부터 N개의 줄에 걸쳐 각 정수가 주어진다. 주어지는 정수의 절댓값은 9223372036854775807보다 작거

www.acmicpc.net

굉장히 쉬운 문제다. 그냥 입력을 받고 더해준 다음 부호를 확인해주고 출력하면 된다. 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 로 옮기는 것이 효율적이다.

전라남도교육지원청