안녕하세요
백준 알고리즘 단계별로 풀어보기 7단계 문자열 반복을 풀어봤습니다
이번 문제는 딱 보는 순간 다양한 방식으로 풀 수 있을 것 같았습니다
BufferedReadered를 응용하여 푸는 방법, 배열을 사용한 방법 등 여러 가지 방식이 생각이 났습니다 ㅎ
제가 푼 여러 가지 방법에 대해서 설명해보겠습니다
문제 링크입니다
https://www.acmicpc.net/problem/2675
문제
문자열 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글자를 넘지 않는다.
출력
각 테스트 케이스에 대해 P를 출력한다.
문제 풀이
제가 풀은 첫 번째 방식입니다
가장 노멀 한 방법으로 풀었다고 생각합니다
삼 중 for문을 돌려서 N만큼 반복 -> 문자열을 하나씩 반복 -> 문자열 반복 입력으로 풀었습니다
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
// BufferedReader 및 StringBuilder 변수 선언
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
// 반복할 갯수 및 반복할 문자열 선언
int N = Integer.parseInt(br.readLine());
String str;
// N만큼 반복
for(int i = 0; i < N; i++) {
// 문자열 입력
str = br.readLine();
// 입력한 문자열 하나씩 처리
for(int j = 2; j < str.length(); j ++)
{
// 문자열 반복입력
for(int k = 0; k < str.charAt(0) - 48; k++)
{
sb.append(str.charAt(j));
}
}
// Enter처리
sb.append("\n");
}
// 결과 출력
System.out.print(sb);
}
}
두 번째 방법입니다
첫 번째 방법과 똑같은 삼중 for문을 사용하여 구현하였습니다
하지만 반복할 개수와 반복할 문자열을 구할 때 split 메서드를 사용하여 구현하였습니다
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
// BufferedReader 및 StringBuilder 변수 선언
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
// 반복할 갯수 선언
int N = Integer.parseInt(br.readLine());
// N만큼 반복
for(int i = 0; i < N; i++) {
// 공백으로 쪼개 배열로 입력
String[] str = br.readLine().split(" ");
// 문자열 및 반복할 갯수 입력
String Name = str[1];
int M = Integer.parseInt(str[0]);
// 문자열만큼 반복
for(int j = 0; j < Name.length(); j ++)
{
// 문자열 반복입력
for(int k = 0; k < M; k++)
{
sb.append(Name.charAt(j));
}
}
// Enter처리
sb.append("\n");
}
// 결과 출력
System.out.print(sb);
}
}
세 번째 방법입니다
세 번째 방법은 StringTokenizer 메서드를 사용하여 문자열을 쪼개어 반복할 갯수와 문자열을 구해줍니다
삼중 for문이 아닌 이중 for문을 사용하여 문자열을 반복할 때 repeat메서드를 사용하여 반복 처리를 하였습니다
자바 11에서 추가된 기능으로 repeat메서드는 문자열을 반복할 때 사용하는 메서드입니다
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
// BufferedReader 및 StringBuilder 변수 선언
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
// 반복할 갯수 선언
int N = Integer.parseInt(br.readLine());
// N만큼 반복
for(int i = 0; i < N; i++) {
// StringTokenizer 변수 선언
StringTokenizer st = new StringTokenizer(br.readLine());
// 문자열 반복 갯수 및 문자열을 char[] 배열로 입력
int j = Integer.parseInt(st.nextToken());
char[] str = st.nextToken().toCharArray();
// 문자열만큼 반복입력
for(int k = 0; k < str.length; k++)
{
// repeat메서드를 사용하여 문자열 반복 입력
sb.append(String.valueOf(str[k]).repeat(j));
}
// Enter 입력
sb.append("\n");
}
// 결과 출력
System.out.print(sb);
}
}
여기까지 백준 알고리즘 2675번 문자열 반복을 풀은 내용이었습니다
이제 속도 비교를 해보겠습니다!
속도 비교
차례대로
1. 삼중 for문 사용
2. 삼중for문 배열 사용
3. StringTokenizer 및 repeat메서드 사용
입니다
속도는 노멀 한 방법인 삼중 for문을 사용한 방법이 제일 빨랐습니다
하지만 메모리는 의외로 StringTokenizer와 repeat 메서드를 사용한 방식이 제일 빠르게 나왔네요
제 예상에는 첫 번째 방법이 속도와 메모리 둘 다 빠를 줄 알았는데... ㄷㄷ;;
이상 백준 알고리즘 2675번 문자열 반복을 풀은 내용이었습니다!!!
다음 문제 : 2021.05.16 - [알고리즘/알고리즘JAVA] - [백준알고리즘/문자열] 1157번 문제 : 단어 공부(자바/JAVA)
이전 문제 : 2021.05.15 - [알고리즘/알고리즘JAVA] - [백준알고리즘/문자열] 10809번 문제 : 알파벳 찾기(자바/JAVA)
'알고리즘 > 알고리즘JAVA' 카테고리의 다른 글
[백준알고리즘/문자열] 2908번 문제 : 상수(자바/JAVA) (0) | 2021.05.17 |
---|---|
[백준알고리즘/문자열] 1157번 문제 : 단어 공부(자바/JAVA) (0) | 2021.05.16 |
[백준알고리즘/문자열] 10809번 문제 : 알파벳 찾기(자바/JAVA) (0) | 2021.05.15 |
[백준알고리즘/문자열] 11720번 문제 : 숫자의 합(자바/JAVA) (0) | 2021.05.13 |
[백준알고리즘/문자열] 11654번 문제 : 아스키 코드(자바/JAVA) (0) | 2021.05.12 |