안녕하세요
인포돈 입니다.
백준 알고리즘 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() 메서드를 통해서 버퍼에 하나씩 저장하여 출력하는 코드였습니다.
제가 썼던 방식보다 간결하고 빠른 속도를 자랑하는 코드였습니다.
생각의 전환이 항상 필요하다고 느끼는 문제였습니다.
'알고리즘 > 백준알고리즘' 카테고리의 다른 글
[백준알고리즘-JAVA]1152번 풀이(단어의 개수) (0) | 2021.04.08 |
---|---|
[백준알고리즘-JAVA]1157번 풀이(단어공부) (0) | 2021.04.07 |
[백준알고리즘-JAVA]11720번 풀이(숫자의 합) (0) | 2021.04.05 |
[백준알고리즘-JAVA]4673번 풀이(셀프넘버) (1) | 2021.04.04 |
[백준알고리즘-JAVA]4344번 풀이(평균은 넘겠지) (0) | 2021.04.03 |