백준알고리즘
백준알고리즘:p2675 문자열 반복
socialcomputer
2021. 2. 23. 17:43
반응형
분류: 문자열
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번 중첩해서 쓰지 않는 방법은 아마도 없는듯..?
채점결과
링크 www.acmicpc.net/problem/2675
2675번: 문자열 반복
문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다
www.acmicpc.net
반응형