loading

알고리즘/알고리즘JAVA

[백준알고리즘/문자열] 2675번 문제 : 문자열 반복(자바/JAVA)

침착곰 2021. 5. 15. 15:39
반응형

안녕하세요

백준 알고리즘 단계별로 풀어보기 7단계 문자열 반복을 풀어봤습니다

이번 문제는 딱 보는 순간 다양한 방식으로 풀 수 있을 것 같았습니다

BufferedReadered를 응용하여 푸는 방법, 배열을 사용한 방법 등 여러 가지 방식이 생각이 났습니다 ㅎ

제가 푼 여러 가지 방법에 대해서 설명해보겠습니다

 


문제 링크입니다

https://www.acmicpc.net/problem/2675

 

2675번: 문자열 반복

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

www.acmicpc.net

 

문제

문자열 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)

 

반응형
그리드형