본문 바로가기
백준알고리즘

백준알고리즘:p2675 문자열 반복

by socialcomputer 2021. 2. 23.

분류: 문자열

 

Q :  문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다. S에는 QR Code "alphanumeric" 문자만 들어있다.

QR Code "alphanumeric" 문자는 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\$%*+-./: 이다.

입력 출력
첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 각 테스트 케이스는 반복 횟수 R(1 ≤ R ≤ 8), 문자열 S가 공백으로 구분되어 주어진다. S의 길이는 적어도 1이며, 20글자를 넘지 않는다. 

2
3 ABC
5 /HTP
각 테스트 케이스에 대해 P를 출력한다.





AAABBBCCC
/////HHHHHTTTTTPPPPP

 

코드-StringBuilder사용, println사용

//백준알고리즘 제출시 클래스 이름은 Main으로 바꿔야 됨 
import java.io.BufferedReader;
//import java.io.BufferedWriter;
import java.io.InputStreamReader;
//import java.io.OutputStreamWriter;

public class p2675 {//140ms나옴

	public static void main(String[] args) {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		//BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); //스트링빌더는 이걸로 출력못하나봄..
		
	try {
		int x = Integer.parseInt(br.readLine());
		
		for(int i=0; i<x; i++) {
			String test = br.readLine();
			StringBuilder sb = new StringBuilder();
			
			int y = Integer.parseInt(test.split(" ")[0]); //반복횟수
				for(int k=0; k<test.split(" ")[1].length(); k++) {//문자열 인덱스
					for(int j=0; j<y; j++) { //반복은 여기서
						sb.append(test.split(" ")[1].charAt(k));
					}
				}
				System.out.println(sb);
		}
	}catch(Exception e) {}
		
	}

}

 

코드-StringTokenizer 사용, bufferedWriter사용

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class p2675_tokenizer {//이게 더빠름(128ms) 왜냐, 출력까지 buffered를 썼으니까(스트링 빌더는 bw로 못 출력해서 println으로했기 때문)

	public static void main(String[] args) {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
				
		try {
			int x = Integer.parseInt(br.readLine());
				
			for(int i=0; i<x; i++) {
				StringTokenizer st = new StringTokenizer(br.readLine(), " "); //케이스 갯수
				int y = Integer.parseInt(st.nextToken());
				String test = st.nextToken();
					
					for(int k=0; k<test.length(); k++) {//문자열 인덱스
						for(int j=0; j<y; j++) { //반복은 여기서
							bw.write(test.charAt(k));
						}
					}
					bw.write("\n");
			}
			bw.flush();
		}catch(Exception e) {}
	}
}

▶두번째 코드가 출력까지 버퍼를 사용해서 그런지 속도가 더 빨랐다. 

140ms -> 128ms

StringBuilder를 버퍼에 write출력하려는데 안된다고 빨간줄이 뜬다. 

그래서 스트링빌더 쓴 곳은 println을 사용했고,

두번째 코드에선 토큰을 사용해 버퍼로 출력해봤다.....

 

 

▶for문을 3번 중첩해서 쓰지 않는 방법은 아마도 없는듯..?

 


채점결과

위는 BufferedWriter, 아래는 println

링크 www.acmicpc.net/problem/2675

 

2675번: 문자열 반복

문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다

www.acmicpc.net

 

댓글