BOJ

[백준 2675번/JAVA] 문자열 반복

syj0522 2024. 3. 8. 14:49

문제

백준 2675번

정수 T를 입력받고, 정수 R, 문자열 S를 'R S' 형식으로 T번 입력받는다.
S의 각 문자를 R번 반복해 이어붙인 새로운 문자열 P를 만든 후 출력한다.

풀이 1) BufferedReader + charAt()

BufferedReader로 T를 입력받는다.

 

for문을 T번 반복하며 R S를 입력받는다. R과 S는 한 줄로 이루어져있고 공백으로 구분되므로, BufferedReader의 readLine()을 통해 한 줄을 읽은 후 StringTokenizer의 nextToken()으로 공백 기준으로 잘린 토큰을 하나씩 꺼내 저장한다.

 

R S를 입력받을 때마다 S.length()만큼 for문을 돌며 S.charAt(i)를 버퍼에 R번 저장한다.

 

이 부분을 구현하며 3중 for문이 만들어졌는데 (..) T는 1,000 이하의 수, R은 8 이하의 수, S도 대략 50이 넘지 않는 길이로 입력 되므로 1억회 내로 연산이 가능하다.

코드

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        //T 입력받기
        //T번 반복하며 R S 입력받기
        //S의 각 문자를 R번 반복하여 새로운 문자열 P를 만들기 
        // >> S의 각 문자를 charAt()으로 추출, 각각 R번 반복하며 버퍼에 저장

        int T = Integer.parseInt(br.readLine());
        int R = 0;
        String S = "";

        for(int k=0; k<T; k++) {
            st = new StringTokenizer(br.readLine());
            R = Integer.parseInt(st.nextToken());
            S = st.nextToken();

            for(int i=0; i<S.length(); i++) { //3 ABC이면 A를 추출하여 버퍼에 3번 넣기 -> B를 추출하여 버퍼에 3번 넣기 ...
                for(int j=0; j<R; j++) {
                    bw.write(S.charAt(i));
                }
            }
            bw.write("\n");
        }
        bw.close();
    }
}

 

 

풀이 2) BufferedReader + getBytes()

 

먼저 T를 입력받고, T번 반복하며 다음을 수행한다.

  • readLine()으로 한 줄을 입력받고 split(" ")으로 공백을 기준으로 분할하여 str[]에 저장. 3 ABC가 입력되었다면 str[0]에 3, str[1]에 ABC가 저장된다.
  • 변수 R에 str[0]값을 저장한다. 
  • str[1]값을 getBytes()를 사용해 바이트 배열로 변환하고, 각 배열의 요소를 char로 변환해 StringBuilder에 append한다.

코드

import java.util.*;
import java.io.*;

public class Main {
	public static void main(String[] args)throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringBuilder sb = new StringBuilder();
		
		int T = Integer.parseInt(br.readLine());
		
		for(int i=0; i<T; i++) {
			String[] str = br.readLine().split(" "); //공백을 기준으로 입력된 문자열을 분할하여 str배열에 저장
			int R = Integer.parseInt(str[0]); //str[0]을 정수로 변환하여 R에 저장
			
			for(byte val : str[1].getBytes()) { //str[1]에 저장된 문자열을 getBytes()를 사용해 새로운 바이트 배열로 리턴, 요소를 하나씩 꺼냄
				for(int j=0; j<R; j++) {
					sb.append((char)val); //바이트 코드를 char로 변환, StringBuilder에 append
				}
			}
			sb.append('\n');
		}
		System.out.print(sb);
	}
}

풀이 3) Scanner + charAt()

BufferedReader 대신 Scanner을 사용해보자.

 

BufferedReader의 readLine()으로 입력받으면 한 줄씩 읽어오게 되므로 split()이나 StringTokenizer를 사용해 공백 기준으로 값을 구분해서 저장하는 작업을 해야했다.

 

Scanner는 공백 문자 전까지의 내용만 가져오는 함수 next()가 있으므로 이것을 사용하면 된다.

* nextLine()은 입력받은 문자열의 공백문자까지 포함한 한 줄을 다 가져오므로 쓰지 않도록 주의

코드

import java.util.*;

public class Main {
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		
		int T = sc.nextInt(); 
		
		for(int k=0; k<T; k++) {
			int R = sc.nextInt();
			String S = sc.next();
			for(int i=0; i<S.length(); i++) {
				for(int j=0; j<R; j++) {
					System.out.print(S.charAt(i));
				}
			}
			System.out.println();
		}
	}
}

BufferedReader + charAt()

BufferedReader + getBytes()

Scanner + charAt()

 

Scanner보다는 BufferedReader가 성능이 좋고 charAt()보다 getBytes()를 사용한 코드가 성능이 좋았다.