gone

#[백준] 2675 문자열 반복 (StringBuilder 클래스) 본문

알고리즘

#[백준] 2675 문자열 반복 (StringBuilder 클래스)

예쁨받는 돌맹이 2024. 1. 11. 16:42

 

 

문제를 이해를 못해서 한참을 해멧던 문제이다 ㅠ

 

문제 해석)

1. 첫번째로 입력할 값 = 테스트 케이스 개수

예시 입력을 보면 2 => 케이스 2개라는 뜻이다. 그래서 예시 출력에 2개의 케이스에 대한 결과 값이 도출 되었다.

따라서 첫번째 입력값은 테스트할 케이스 개수가 되어야한다.

 

2. 테스트할 조건 입력

첫번째 입력값 이후 다음줄에서는 (반복할 횟수) + (반복할 문자열) 이 입력되어야된다.

 

3. 입력된 문자열은 문자단위로 반복횟수만큼 보여주어야된다.

3 ABC 입력할할 경우AAABBBCCC 결과가 나와야 한다.

 


제출1) Scanner 클래스사용

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int T = in.nextInt();
        for (int i = 0; i < T; i++) {

            int R = in.nextInt();
            String S = in.next(); // nextLine() 을 쓰면 error!

            for (int j = 0; j < S.length(); j++) {
                for (int k = 0; k < R; k++) { // R 만큼 반복 출력
                    System.out.print(S.charAt(j));
                }
            }

            System.out.println();
        }
    }
}

 

 

String S = in.next(); 대신 .nextLine()을 사용하면 오류는 아니지만 제출할때 문제가 발생한다.

nextLine()은 입력과정에서 발생하는 공백을 읽어드리기때문에  3 ABC 을 입력하면 ' ABC' 공백을 포함한 문자열을 인식하여 아래와 같은 결과가 발생한다.

// 입력 nextLine()
3 ABC
5 /HTP

// 출력
   AAABBBCCC 			// 3개의 공백이 출력됨
     /////HHHHHTTTTTPPPPP 	// 5개의 공백이 출력됨

제출2) BufferedReader 클래스사용

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
 
public class Main {
 
	public static void main(String[] args) throws IOException {
 
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int T = Integer.parseInt(br.readLine());
		
		for(int i = 0; i < T; i++) {
	
			String[] str = br.readLine().split(" ");	// 공백 분리
			
			int R = Integer.parseInt(str[0]);	// String -> int
			String S = str[1];
			
			for(int j = 0; j < S.length(); j++) {
				for(int k = 0; k < R; k++) {
					System.out.print(S.charAt(j));
				}
			}
			System.out.println();
		}
	}
}

 


제출3) BufferedReader 클래스 & StringBuilder 클래스 & getBytes() 메소드 사용

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
 
public class Main {
 
	public static void main(String[] args) throws IOException {
    
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
        
		int T = Integer.parseInt(br.readLine());        
 
		for (int i = 0; i < T; i++) {
 
			String[] str = br.readLine().split(" ");
 
			int R = Integer.parseInt(str[0]);
 
			for (byte val : str[1].getBytes()) {
				for (int j = 0; j < R; j++) {
					sb.append((char)val);
				}
			}
			sb.append('\n');
		}
		System.out.print(sb);
	}
}

 

 

위에서 제출했던 코드들은 모두 System.out.print(); 를 문자열을 출력하였다.

 

보여줘야되는 코드는 단순 출력이여서 System.out.print() 이지만, 만약 문자열끼리 더해서 보여지는 경우는 StringBuilder을 이용하는것이 좀더 효율적이다.

 

우선 String에 대해 알아된다.

String이란?

Java 에서 String불변(immutable)한 문자열을 처리하기 위한 클래스이다. 즉, String 객체가 생성되면 그 값은 변경되지 않는다. "새로운 객체" 로 추가 변경된다.

 

그러면 StringBuilder은 무엇일까?

StringBuilder sb = new StringBuilder();

 

 

StringBuilder란?

Java에서 StringBuilder는 가변(mutable)한 문자열을 처리하기 위한 클래스이다. 새로운 문자열을 추가하거나 변경하게 되면 마찬가지로 "새로운 객체" 로 추가 변경된다. 하지만 멀티쓰레드 환경에서 안정적이지 않아 싱글쓰레드에서 사용하는것을 추천한다.

 

따라서  String A 객체와 String B 객체를 더하는 행위는 메모리 할당과 메모리 해체발생과 성능이 좋아지지 않게되므로  StringBuilder() 클래스를 사용함으로써 문자열을 더할때 새로운 객체를 생성하는 것이 아니라 기존의 데이터를 더하는 방식이기 때문에 상대적으로 부하가 적다는걸 알 수 있다.

 

자세한 설명은 아래의 블로그가 자세히 설명하고있다.

 

[Java] String, StringBuffer, StringBuilder 이해하기

해당 페이지에서는 String과 StringBuffer, StringBuilder에 대해서 이해하고 각각의 차이점과 언제 사용해야 하는지에 대해 이해하기 위한 글입니다. 1) String, StringBuffer, StringBuilder 💡 String이란? - Java에

adjh54.tistory.com

 

코드의 한두줄의 변경으로 이렇게 유의미한 성능차이를 문제를 풀때마다 눈으로 확인하면서 공부하니 공부하는데 좀더 재미가 있는것같다 ㅎㅎ

'알고리즘' 카테고리의 다른 글

#[백준] 1152 단어의 개수(StringTokenizer 클래스)  (0) 2024.01.12
#[백준] 11720 숫자의 합  (1) 2024.01.11
#[백준] 10809 알파벳찾기  (0) 2024.01.11