코딩테스트 (C#)

백준 15552 : 빠른 A+B - C# 풀이

UniCoti-sub 2024. 8. 27.
반응형

문제 사진

이 문제가 코딩 테스트를 하면서 아마 처음으로 새로운 기술을 배운 문제일 것이다.

일반적인 Console.WriteLine을 사용하면 시간 초과로 문제가 틀렸다고 뜨는 특이한 문제다.

여기서는 새로운 입출력 방법에 대해서 알기만 하면 쉽게 풀 수 있다.

 

C#에서는 streamReader와 streamWriter에 대해서 공부하면 쉽게 풀 수 있다.

물론 모두 이해하려면 버퍼스트림도 알아야 한다.

이에 대해서는 따로 공부해서 메인 블로그에 올리도록 하겠다.

 

using System;
using System.IO;

namespace unicoti {
    class Program {
        static void Main(string[] args) {
            StreamReader sr = new(new BufferedStream(Console.OpenStandardInput()));
            StreamWriter sw = new(new BufferedStream(Console.OpenStandardOutput()));
            
            int testCaseCount = int.Parse(sr.ReadLine());
            for(int i = 0; i < testCaseCount; i++) {
                string[] arr = sr.ReadLine().Split(' ');
                
                if (int.TryParse(arr[0], out int num1) && int.TryParse(arr[1], out int num2)) {
                    sw.WriteLine(num1 + num2);
                }
            } 
            sr.Close();
            sw.Close();
        }
    }
}

 

코드는 이렇게 구성했다.

sr과 sw를 만들어서 입출력을 구현했다.

if문으로 예외처리도 하면서 읽기도 한번에 한 코드도 인상적이다.

 

나머지는 쉽게 이해할 수 있을 것이다.

마지막 2줄은 스트림리더의 특징이라 설명할게 없다.

사용 후 닫는 과정이 필요하다

 

using System;
using System.Text;

namespace unicoti {
    class Program {
        static void Main(string[] args) {
            int.TryParse(Console.ReadLine(), out int t);
            StringBuilder sb = new StringBuilder();
            
            for(int i = 0; i < t; i++) {
                string[] arr = Console.ReadLine().Split(' ');
                if (int.TryParse(arr[0], out int num1) && int.TryParse(arr[1], out int num2)) {
                    sb.Append((num1+num2) + "\n");
                }
            } 
            Console.WriteLine(sb);
        }
    }
}

 

또는 stringbuilder를 이용해서 더욱 간단하게 문제를 풀 수 있다.

stringbuilder에다가 저장해둔 뒤 출력문을 한번만 작성하는 방법이다.

WriteLine의 사용을 줄이는 게 가장 중요한 요점인 것 같다.

 

https://milkyquartz.tistory.com/28 (참고 블로그)

 

[C#] 백준 15552번 빠른 A+B

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

milkyquartz.tistory.com

(왕위를.. 계승중입니다)


오늘의 느낀점)

더 빠른 입출력 StreamReader와 StreamWriter에 대해서 알 수 있었다.

리팩토링이나 최적화를 할때 유용하게 사용할 수 있을 것 같다.

근데 사실 입출력을 게임 개발에서 할 이유가 없어서 사용 못할 것 같기도 하다.

그래도 새로운 기술과 몰랐던 정보를 알게 되어 고마운 문제이다.

 

stringbuilder는 이미 알고 있었으나 사용법을 다시 떠올릴 수 있었고,

지금까지 변수를 하나 만든 다음에 int.tryparse를 사용했었는데,

out int variable 형식을 사용하면 만듦과 동시에 저장이 가능하며

null 참조 가능 에러도 피할 수 있다는 걸 알게 되었다.

 

개인적으로 더 깊게 공부해서 메인 블로그에 올려야겠다.

그 글이 완료될 쯤이면 이 글에도 링크가 올라가 있을 것이다.


이상으로 도움이 되었길 바라며,

 

끝.

반응형

'코딩테스트 (C#)' 카테고리의 다른 글

백준 11022 : A+B - 8  (0) 2024.08.28
백준 11021 : A+B - 7  (0) 2024.08.27
백준 25314 : 코딩은 체육과목 입니다 - C# 풀이  (0) 2024.08.27
백준 25304 : 영수증 - C# 풀이  (0) 2024.08.23
백준 8393 : 합 - C# 풀이  (0) 2024.08.22

댓글