99클럽 코테 스터디 2일차 TIL + 그대로 출력하기 2

sun·2025년 1월 14일
0
post-thumbnail

오늘의 학습 키워드 및 문제

#문자열 #EOF
[백준] 그대로 출력하기 2
https://www.acmicpc.net/problem/11719

문제풀이

이 문제.. 낯설지 않다.
언제 입력이 끝날지 모르는 EOF문제다.
다행히 이 문제와 비슷한 문제를 풀어본 적이 있기 때문에 오래걸리지 않았다.

BufferedReader 클래스를 사용해서 입력을 받을 때 입력이 끝났다는 것을 알 수 있는 방법은
readLine()이 null이거나 ""를 입력할 때이다.
하지만 문제에서 아무런 값도 입력하지 않을 수 있다고 했기 때문에 ""를 입력했을 때 종료하는 것은 올바르지 않다.
(문제를 잘 못봐서 틀렸었음..)
while 반복문을 통해 입력값이 null인지 확인하여 출력하거나 반복문을 종료하도록 코드를 작성했다.

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        // 입력 초기화
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        Boolean tf = true;
        while(tf) {
            // 문자열 입력
            String s = br.readLine();
            
            // 입력이 끝났을 시 종료, 안끝났으면 출력
            if (s == null) {
                tf = false;
            } else {
                System.out.println(s);
            }
        }
        // 입력 닫기
        br.close();
    }
}

다른방법

1. tf 변수 대신 true와 break 사용

기본적인 break문을 까먹다니,, 하지만 오늘로 상기시켰으니 다음부터는 잘 사용할 것이라고 믿는다. (성공)

2. StringBuilder 사용

문제를 풀고 다른 사람들의 코드를 보니 StringBuilder를 사용하여 문자열을 append하고 반복문이 끝나면 한꺼번에 print하는 방식을 보았다.
나는 String을 사용하고 있는데 또 StringBuilder를 사용하여 append를 왜 하지?라는 의문이 들었다. 그냥 출력하면 되는거 아닌가하는 생각이 들었기 때문!
하지만 다 이유가 있었다.

  • System.out.println
    • 메모리에 저장하지 않고 바로 출력 => 메모리 사용량 낮음
    • 호출될 때마다 출력 작업 수행 => 호출 횟수가 많아질수록 성능 저하
  • StringBuilder
    • String과 달리 문자열이 달라질 때마다 새로운 객체를 생성하지 않음
    • 내부적으로 배열을 사용하여 문자열을 결합 => 반복적인 결합 연산에 성능 좋음
    • 문자열 결합 시 출력을 한 번만 하면 됨 => 출력 오버헤드 줄어들어 상대적으로 빠름
    • 입력 이터가 많을 경우 메모리 부족 문제 발생 가능성 있음

입력이 많고, 결합 연산이 필요한 경우에는 StringBuilder가 더 효율적이다.
입력이 많고, 실시간 출력이 가능한 경우는 System.out.println이 메모리를 절약할 수 있어 더 효율적이다.
어느 방법이 더 좋다~ 라고 말하기는 어려울 것 같다. (성공)

공부한 내용정리

  • 반복문을 종료하는 방법 중 하나는 break
  • 입력 데이터를 출력할 때 System.out.println 만 사용했을 때와 StringBuilder와 System.out.println이 함께 사용했을 때의 차이
profile
Please, Steadily

0개의 댓글

관련 채용 정보