본문 바로가기

알고리즘/백준

[백준 알고리즘 자바]2675 : 문자열 반복

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를 출력한다.

입출력 예제


문제를 잘못 이해해서 바보같은 짓만 하다가 풀이소스 찾아보고 그제서야 깨달았다..다음부턴 지문을 좀 더 자세히 읽자..

많은 문제를 빨리 풀어서 코테 레벨까지 올려야 코테연습 시작하는데..갈 길이 너무 멀다. 좀만 더 열심히 하자

 

풀이 방식은 총 2 가지이다.

1. toCharArray() 사용

2. BufferedReader 사용

 

- P.S :

필자는 Scanner를 사용하여 첫번째 방식으로 풀어 제출했을 때, 자꾸만 [출력초과] 라고 나왔다.

알고보니 중간에 값 확인을 위해 System.out.println()을 여러군데 적어놨는데, 이를 지우지 않았기 때문이었다.

앞으로 필요없는 소스는 잘 보고 반드시 제거해야겠다.

1. toCharArray 사용

첫번째로 toCharArray()를 사용한 풀이 방식에 대해 정리해보자.

 

1. 테스트 케이스 T를 입력받기 위한 변수를 선언한다.

 

2. T만큼 도는 for문을 작성한다.

 

3. 해당 for문 안에서 반복하는 횟수와 문자열을 선언한다.

  • 반복할 횟수 R과 문자열 S가 테스트 케이스만큼 입력되어야 하기 때문에 해당 for문 안에서 입력한다.
  • 이 때, 문자열 S는 sc.next()를 통해 문자열로 입력받되, toCharArray()를 통해서 문자 배열로 만들어 저장한다.

4. 그 후에 문자열의 길이만큼 도는 for문을 작성한다.

 

5. 해당 for문 안에서 다시 반복할 횟수만큼 도는 for문을 작성한다.

  • S 배열에서 문자 하나당 R번의 반복을 하기 위해 R번만큼 돌린다.

6. 결과값을 출력하되, 예제 출력과 동일하게 만들기 위해 println()을 추가한다.

  • print() 이기 때문에 테트스케이스 1개당 즉, 예제 출력과 동일한 형태로 만들기 위해 j 횟수만큼 도는 for문이 끝난 후에 println()을 추가한다.

    수행 결과를 확인한다.

1. 답안 소스(toCharArray)

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();
		
		for(int i=0; i<T; i++) {
			int R = sc.nextInt();
			char[] S = sc.next().toCharArray();
			
			for(int j=0; j<S.length; j++) {
				for(int z=0; z<R; z++) {
					System.out.print(S[j]);
				}
			}
			System.out.println();
		}
	}
}

2. BufferedReader 사용

다음으로는 BufferedReader를 사용한 풀이 방식을 정리해보자.

BufferedReader 사용이 오랜만이라 사용 방식부터 복습하고 작업했다.

 

1. BufferedReader에는 throws Exception이 필수이므로 추가 작성한다.

 

2. BufferedReader를 선언하고, 입력받을 테스트 케이스도 선언한다.

  • readLine() : 한 줄을 읽어 문자열을 리턴해주는 메소드이다.
  • 리턴값이 String으로 고정되므로 다른 타입으로 입력받기 위해서는 형변환이 필수이다.

3. T만큼 도는 for문을 선언한다.

 

4. 공백을 제거한 문자 배열 str, 반복 횟수 R, 문자열 S를 선언한다.

  • String[] str : 입력받은 문자열 중 맨 앞에는 반복 횟수이므로 분리하여 따로 저장한다.

        - 예를 들어 [3 AAA] 라는 문자열이 입력되었으면 split()를 통해 공백 기준으로 분리하였으므로 해당 배열에는 3, AAA 라는 2개의 값이 존재하는 것이다.

  • int R : 반복 횟수이다. str 배열에서 분리한 값 중에 인덱스가 0, 즉 맨 앞에 값은 반복 횟수 즉, 3을 의미한다.
  • String S : 입력받은 문자열이다. 인덱스가 1인 값은 문자열 즉, AAA 값을 의미한다.

5. 문자열의 길이만큼 도는 for문과 그 안에 반복 횟수만큼 도는 for문을 선언한다.

 

6. 문자열 S를 charAt()을 통해 문자 하나씩 분리하여 반복 횟수만큼 출력한다.

 

7. 결과값을 출력하되, 예제 출력과 동일하게 만들기 위해 println()을 추가한다.

 

수행 결과를 확인한다.

2. 답안 소스(BufferedReader)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
		
		for(int i=0; i<T; i++) {
			String[] str = br.readLine().split(" ");
			int R = Integer.parseInt(str[0]);
			String S = str[1];
			
			for(int j=0; j<S.length(); j++) {
				for(int z=0; z<R; z++) {
					System.out.print(S.charAt(j));
				}
			}
			System.out.println();
		}
	}
}