백준 알고리즘/문자열

[JAVA 자바] 백준 2675번 : 문자열 반복

Sun720 2022. 6. 3. 11:31

▶ 문제

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

 

2675번: 문자열 반복

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

www.acmicpc.net

 

 

 설명

한 단어의 알파벳들을 주어진 입력값만큼 반복해서 출력하는 문제이다.

 

반복을 어떤 것 부터 돌려야 할지를 먼저 고려해야 했다.

반복 1. 제일 기본적인 테스트케이스 수를 반복하고,

그 안에 문자열의 알파벳 하나하나를 잘게 쪼개서

알파벳마다 주어진 횟수대로 반복해야 하기 때문에

반복 2. 문자열 길이만큼 반복문을 돌려야겠다는 생각을 했다.

반복 3. 그리고 알파벳 각각을 주어진 값 만큼 반복출력해야 하기에 그 횟수만큼 반복문을 또 돌리면 이 문제는 끝이다.

 

이렇게 해서 3개의 중첩 반복문이 만들어지게 된다.

이제 관건은 '입력받은 문자열을 알파벳 한글자씩 어떻게 쪼갤까' 이다. 

이 때 활용해 볼 수 있는 메소드로 charAt( ) 혹은 toCharArray( ) 가 있다. 

 

 

 

 

문제 풀이

🌱 풀이1. charAt( ) 사용

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 NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int t = Integer.parseInt(br.readLine());
		StringTokenizer strTo;
        
		for (int i = 0; i < t; i++) {
			strTo = new StringTokenizer(br.readLine(), " ");
			int n = Integer.parseInt(strTo.nextToken()); 
			String s = strTo.nextToken(); 
            
			for (int j = 0; j < s.length(); j++) {
				int count = 0;
                
				while (count < n) {
					sb.append(s.charAt(j));
					count++;
				}
			}
			sb.append("\n");
		}
		System.out.println(sb);
	}
}

입출력에는 BufferedReader와 StringBuilder 를 사용했다. 출력문이 긴 경우엔 StringBuilder를 쓰는 것이 성능에 좋다.

 

charAt()메소드를 이용하여서 입력받은 문자열을 한 글자씩 호출하였다.

 

count 변수로 반복할 때마다 1씩 증가시켜서

입력된 반복횟수가 될 때까지 문자열을 반복 호출하도록 하는 while 문을 만들었다.

 

 

 

 

🌱 풀이2. char 배열 , toCharArray() 사용

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 NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		int t = Integer.parseInt(br.readLine()); // 출력할 단어의 수
		StringTokenizer strTo;
		
		for (int i = 0; i < t; i++) {
			
			strTo = new StringTokenizer(br.readLine(), " ");
			
			int n = Integer.parseInt(strTo.nextToken()); // 반복할 횟수
			char arr[] = strTo.nextToken().toCharArray(); 
			
			String str=" ";
			for (int j = 0; j < arr.length; j++) {
				for(int k = 0; k < n; k++) {
					str += arr[k];
				}
			}
			sb.append(str).append("\n");		
		}
		System.out.println(sb);
	}
}

 char arr[] = strTo.nextToken().toCharArray();  

반복할 횟수와 문자열을 입력 받을 때 문자열을 char 배열로 입력받았다.

 

toCharArray() 의미 : Converts this string to a new character array. 문자열에서 char 형으로 형변환 해준다.

예를 들어 문자열 "ABC"를 toCharArray() 메소드에 사용한다면 'A','B','C' 와 같이 char 형으로 한글자씩 분리된 char 형 배열을 형성해주는 것이다. 

 

 String str=" "; 

str라는 문자열 변수를 초기화를 해주고,

이 변수에 입력된 반복 횟수만큼 char형 문자를 반복하여 출력하면 된다.

 

 

 

🌱 풀이3. toCharArray() 사용 (for each 문)

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 br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		StringTokenizer strTo;
		
		int t = Integer.parseInt(br.readLine());

		for (int i = 0; i < t; i++) {

			strTo = new StringTokenizer(br.readLine());
			int n = Integer.parseInt(st.nextToken());
			String s = strTo.nextToken();

			for (char ch : s.toCharArray()) {
				for (int k = 0; k < n; k++) {
					sb.append(ch);
				}
			}
			sb.append("\n");
		}
		System.out.println(sb);		
	}
}

위의 풀이2와 같이 toCharArray() 메소드를 사용했지만 굳이 char 배열을 명시적으로 초기화주지 않고도 for each 문을 통해 입력받은 문자열의 알파벳을 차례로 호출하여 반복 출력할 수가 있다.

이전에 사용해보지 않았던 방법인데 앞으로 간략하게 코드를 짤 수 있으니 이 방법을 자주 사용해보도록 해야겠다.

 

 

Log

메소드를 알아갈 수록 아이템을 얻어가는 기분이다. 없으면 없는대로 어떻게든 조합해서 코드를 짤 수 있으나 알면 알수록 더욱 다양한 공략 방법을 지니게 되는것 같다. 그때 그때 필요에 따라 메소드를 최대한 많이 익혀보도록 노력해야겠다.

 

728x90
반응형