문제
정수 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()를 사용한 코드가 성능이 좋았다.
'BOJ' 카테고리의 다른 글
[백준 2908/JAVA] 상수 | StringBuffer와 StringBuilder의 차이 (0) | 2024.03.09 |
---|---|
[백준 1152/JAVA] 단어의 개수 (0) | 2024.03.08 |
[백준 10809번/JAVA] 알파벳 찾기 | 문자열 (2) | 2024.03.07 |
[백준 11720번/JAVA] 숫자의 합 | charAt(), getBytes() (0) | 2024.03.06 |
[백준 9086번/JAVA] 문자열 | String.valueOf(), subString() | String.valueOf()와 toString()의 차이점 (0) | 2024.03.05 |