ejyoo's 개발 노트

[코딩 기초 트레이닝] 문자열 출력하기 본문

문제풀이/코드프로그래머스 문제풀이

[코딩 기초 트레이닝] 문자열 출력하기

ejyoovV 2023. 10. 12. 02:05

문제, 초기 솔루션

[문제]
문자열 str이 주어질 때, str을 출력하는 코드를 작성해 보세요.
[제한사항]
- 1 ≤ str의 길이 ≤ 1,000,000
- str에는 공백이 없으며, 첫째 줄에 한 줄로만 주어집니다.
[입출력예]
- 입력 #1
HelloWorld!
- 출력 #1
HelloWorld!
import java.util.Scanner;

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String a = sc.next();
    }
}

위의 문제는 주어진 문자열 'str'을 출력하는 것이다.

 

문제 풀이

import java.util.Scanner;

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        
        System.out.println(str);
    }
}

솔루션에서 Scanner 객체를 생성해서 사용자의 입력을 받고 next() 로 저장한다. 

제한사항은 코드프로그래머스가 제공하는 테스트 코드에대한 제한사항 같다. 

- 1 ≤ str의 길이 ≤ 1,000,000
- str에는 공백이 없으며, 첫째 줄에 한 줄로만 주어집니다.

Scanner 의 next 는 메서드 공백을 기준으로 입력을 나누기 때문에 제한사항에 'str에는 공백이 없다' 로 되어있는 것이다.

그리고 str의 길이가 최대 1,000,000 까지 가능한다 하는 것은

Scanner 의 내부버퍼의 특성에 있다.

 

Sacnner의 내부버퍼 특성

Scanner는 정규식 기반으로 동작하는 객체로

next() 메서드가 입력 값을 처리할 때 내부적으로 'java.util.regex.Matcher'를 사용한다.

이것은 내부적으로 버퍼를 사용하는데, 기본 버퍼의 크기는 '1024' 문자(char)이고,

필요에 따라 시스템 가용 메모리 한도 내에서 내부 버퍼를 확장한다.

드문 사례지만 매우 큰 입력이 주어져서 Scanner의 내부 버퍼 확장이 시스템 메모리를 초과하게 되면

JVM 이 OutOfMemoryError를 발생시킬 수 있다.

그리고 내부 버퍼를 확장하는 과정에서 성능 저하도 생길 수 있다.

그래서 매우 큰 입력을 처리할 때 BufferedReader 를 사용하는 것이 더 빠를 수 있다.

 


BufferedReader 사용

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.read();
        
        System.out.println(str);
    }
}

 

 

하지만 솔루션에는 Scanner를 사용하여 풀으라고 하는 것 같아서, BufferedReader보단 Scanner를 사용하여 문제를 풀었다.