본문 바로가기

알고리즘/백준알고리즘

[백준알고리즘-JAVA]2675번 풀이(문자열 반복)

안녕하세요

인포돈 입니다.



백준 알고리즘 2675번 풀이입니다. 


* 참고사항
 - 개발환경은 eclipse을 기준으로 작성되었습니다.
 - java언어를 이용하여 문제를 풀이합니다.
 - 알고리즘 문제는 풀이를 보고 해답을 찾는 것도 중요하지만 무엇보다 스스로 풀이를 시도해봐야 합니다!!
(해당 풀이를 보기 전 충분히 문제에 대해 고민해봐야 합니다!)
 - 해당 풀이 말고도 수많은 풀이 방법이 존재합니다.


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

 

입력 예시

2
3 ABC
5 /HTP

출력 예시

AAABBBCCC
/////HHHHHTTTTTPPPPP

성공코드

import java.io.*;

public class Main {
	public static void main(String args[]) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int re = Integer.parseInt(br.readLine());
		StringBuilder sb = new StringBuilder();
		
		for(int i = 0 ; i < re ; i++) {
			String[] str = br.readLine().split(" ");
			String tmp = repeat(Integer.parseInt(str[0]), str[1]);
			sb.append(tmp).append("\n");
		}
		
		System.out.println(sb.toString());
		
		}
	public static String repeat(int rp, String st) {
		int n = st.length();
		 String newstring = "";
		  for (int i = 0; i < n; i++) 
		  {
			  for(int j = 0 ; j < rp ; j++)
		    newstring += st.substring(i,i+1);
		  }
		  return newstring;
	}
	}

해당 코드에서 중요한 점은 바로 substring에 대한 점입니다.

 

문자를 다룰 때는 String 클래스에 있는 메서드들을 적절히 사용하면, 쉽게 코드를 짤 수 있기 때문입니다.

 

즉, 본 문제처럼 하나의 문자열이 아닌 여러 개의 문자열을 처리할 때는 다른 데이터 타입으로 변경하기보다는 String자체에 있는 것을 활용하는 것이 쉽게 짤 수 있다는 점입니다.


본격적으로 해당 문제를 파악해보겠습니다.

 

이번 알고리즘의 흐름도는 아래와 같이 생각해봤습니다.

첫 줄에 먼저 문자열을 몇 개 받을 것인가(입력) -> 받은 문자열을 숫자로 바꾸어 입력을 반복문을 받아온다. -> 받아온 문자열을 " " 공백으로 구분하여 배열에 넣는다 -> 넣은 배열을 String메서드를 통해 반복해준다. -> 출력한다.

 

크게 이렇게 나눌 수 있습니다. 사실 모든 흐름도는 쉽게 할 수 있지만, 가장 중요한 것은 바로 '배열에 String메서드를 통해 반복해준다'라는 곳입니다.

 

입력 예시처럼 ABC라는 문자를 문리 해서 넣어줬다고 생각해 봅시다. 해당 문자를 반복하기 위해서는 어떻게 해야 할까요?

 

몇 번을 반복해야 될지 / 문자열을 어떻게 복사할 것인지 이 두 가지를 해결해야 합니다.


 

몇 번을 반복해야 될지

이 문제는 쉽게 할 수 있습니다. String에서 제공하는 length메서드를 이용하면, 바로 그 문자열의 길이를 알 수 있죠

 

입력 예시 ABC는 3이라는 문자열의 길이가 리턴되게 되죠.

 

문자열을 어떻게 복사할 것인가

이 문제는 정말 여러 가지 방법이 있을 수 있습니다. 따로 char배열에 넣어서 반복할 수도 있고, 저처럼 substring이라는 메서드를 활용할 수도 있지요. 이 외에도 또 기발한 아이디어가 있을 수 있습니다.

 

우선 적으로 저는 substring을 사용했습니다. 왜냐? 저에게 익숙하고 사용하기 편리하기 때문입니다.

 

substring()은 기본적으로 아래와 같이 사용합니다.

String str = "abcdef"
System.out.println(str.substring(0));	// a출력
System.out.println(str.substring(0,3));	// abc출력
System.out.println(str.substring(0,1));	// a출력

이를 이용해 저는 반복 for문을 통해 해당 문자열에서 문자들을 복사할 수 있었죠. 물론 반복하는 횟수를 알기 위해서 이전에 받았던 배열에서 0번째 인덱스를 인자로 받아 반복문에 활용했지요

 

3 abc에서 문자열을 자를 때 " "으로 잘랐기 때문에 String 배열에서 0번째 인덱스에는 3이라는 값이 들어 있게 되죠. 이 부분을 int형을 형 변환을 하여 인자로 넣어준 것입니다!

 


쉽게 해당 문제를 풀이해 보고 나서 다른 분들의 풀이를 몇 개 훑어보았는데, 정말 기막힌 방법이 있어서 하나 더 소개해 드립니다.

 

해당 문제에서 성공코드를 보면 

			String[] str = br.readLine().split(" ");

해당 코드가 있습니다. 여기서 str [0]을 반복문의 반복 횟수로 지정한 뒤 str [1]. charAt() 메서드를 통해서 버퍼에 하나씩 저장하여 출력하는 코드였습니다.

 

제가 썼던 방식보다 간결하고 빠른 속도를 자랑하는 코드였습니다.

 

생각의 전환이 항상 필요하다고 느끼는 문제였습니다.