[백준] 15552번 문제 빠른 A + B

cometrue·2025년 2월 4일

코딩테스트

목록 보기
7/9

문제풀이

flush 연산이란?

flush연산을 설명하기 전에 먼저 버퍼링과 스트림에 대해 알고 있어야한다.

  • 버퍼링
    입출력
    입출력 작업을 한 번에 한 바이트씩 처리하는 것이 아닌 블록을 설정해 이 블록에 입출력 데이터들을 쌓은 뒤, 이 블록 단위로 입출력을 처리하는 방법. 많은 양의 데이터를 처리하기 때문에 입출력 작업의 효율을 높일 수 있다.
  • 스트림
    스트림 : 데이터의 연속적인 흐름을 나타내는 개념으로 파일, 네트워크 메모리 등 다양한 소스와 대상으로부터 데이터를 읽거나 쓸 때 사용되며, 데이터의 흐름을 추상화 한 것이다.

입력과 출력에는 입력 버퍼, 출력 버퍼란 것이 존재하는데, 입력을 받을 때는 입력 버퍼에 데이터를 모은 뒤, 버퍼 내부의 데이터를 한 번에 이동시키고, 출력을 할 때는 출력 버퍼에 출력할 데이터들을 저장한 뒤, 마찬가지로 한 번에 출력한다.
flush 연산은 이러한 버퍼에 남아있는 데이터들을 다음 작업을 위해 비우는 작업을 수행합니다.
버퍼에 존재하는 데이터를 비우는 작업은 많은 소요 시간을 필요로 하기 때문에 기존 방법대로 이 문제를 푼다면 Console.WriteLine() 함수를 호출할 때마다 flush 연산이 수행되어 비교적 오래 걸리게 되는 것이다.

StringBuilder란?

C#의 StringBuilder는 변경할 수 없는 string과 달리 변경 가능한 문자열을 나타내는데 사용하는 클래스이다. string 객체는 값이 변경되면 메모리에서 이전 참조 값을 버리고 새로운 참조 값으로 변경되지만, StringBuilder 객체는 참조 값이 변경되지 않고 힙 메모리에서 값이 삽입, 추가, 제거된다. 

다음은 stringBuilder를 사용해서 문제를 푼 코드이다.

using System;
using System.Text;

namespace backjoon
{
    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder sb = new StringBuilder();

            int t = int.Parse(Console.ReadLine());

            for (int i = 0; i < t; i++) 
            {
                string[] num = Console.ReadLine().Split();
                sb.Append(int.Parse(num[0]) + int.Parse(num[1]) + "\n");
            }
            Console.WriteLine(sb.ToString());
        }
    }
}
profile
게임개발자

0개의 댓글