알고리즘/백준

[백준 3단계] C# 15552 빠른 A+B (StringBuilder, StringReader)

개발하는 디토 2022. 9. 20. 23:29

문제

본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다.

C#

StreamReader로 읽고, StringBuilder로 출력을 모아 놓았다가 그 String을 Console.WriteLine하는 방법이 있습니다.

입력

첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.

출력

각 테스트케이스마다 A+B를 한 줄에 하나씩 순서대로 출력한다.

예제 입력 1

5
1 1
12 34
5 500
40 60
1000 1000

예제 출력 1 

2
46
505
100
2000

 

StringBuilder만 사용한 풀이

StringBuilder를 사용하기 위해 using System.Text가 필요하며 StringBuilder.Append() 함수를 사용했다.

using System;
using System.Text;
namespace Baekjoon
{
    class Program
    {
        static void Main(string[] args)
        {
            int count = int.Parse(Console.ReadLine());
            StringBuilder answer = new StringBuilder();
            string[] nums;

            for (int i = 0; i < count; i++)
            {
                nums = Console.ReadLine().Split(' ');
                answer.Append((int.Parse(nums[0]) + int.Parse(nums[1])).ToString() + "\n");
            }

            Console.WriteLine(answer);            
        }
    }
}

 

이렇게 했을 때 1204ms로 1.2초 정도 걸렸다.

문제의 제한 시간은 1초인데 토론글을 보니 이 문제에서 C#은 보너스 시간이 있다는 것 같다.

 

글 읽기 - 추가 설명 및 다른 언어 빠른 입출력 방법

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 

 

StringBuilder, StringReader를 모두 사용한 버전

using System.IO 필요. StringReader().ReadLine().Split(' ')을 활용했다.

ReadLine() 현재 문자열에서 한 줄의 문자를 읽고 데이터를 문자열로 반환합니다.

 

StringReader 공식 문서

 

StringReader 클래스 (System.IO)

문자열에서 읽어오는 TextReader를 구현합니다.

learn.microsoft.com

using System;
using System.Text;
using System.IO;
namespace Baekjoon
{
    class Program
    {
        static void Main(string[] args)
        {
            int count = int.Parse(Console.ReadLine());
            StringBuilder answer = new StringBuilder();
            string[] nums;


            StringReader reader;
            for (int i = 0; i < count; i++)
            {
                reader = new StringReader(Console.ReadLine());                
                nums = reader.ReadLine().Split(' ');
                answer.AppendLine( (int.Parse(nums[0]) + int.Parse(nums[1])).ToString() );
            }
            Console.WriteLine(answer);
        }
    }
}

 

근데 왜 StringReader 활용한 게 더 느리냐?

StringReader 선언 부분과 reader 에 넣어주는 부분을 생략하면 조금 더 빨라진다.

근데 그래도 1초 넘네.... StringBuilder만 쓴 거랑 시간 똑같음;;

using System;
using System.Text;
using System.IO;
namespace Baekjoon
{
    class Program
    {
        static void Main(string[] args)
        {
            int count = int.Parse(Console.ReadLine());
            StringBuilder answer = new StringBuilder();            
            string[] nums;

            for (int i = 0; i < count; i++)
            {
                nums = new StringReader(Console.ReadLine()).ReadLine().Split(' ');
                answer.AppendLine( (int.Parse(nums[0]) + int.Parse(nums[1])).ToString() );                
            }
            Console.WriteLine(answer);
        }
    }
}

 

 

자매품)

StringWrite.Write()를 사용할 수 있음

Write(StringBuilder) 현재 문자열에 문자열 작성기의 문자열 표현을 씁니다.

StringWriter 공식 문서

 

StringWriter 클래스 (System.IO)

문자열에 정보를 작성하는 TextWriter 를 구현합니다. 정보는 기본 StringBuilder에 저장됩니다.

learn.microsoft.com