본문 바로가기

별걸다하는 IT/알고리즘 문제풀이

[ACM ICPC 2011 기출, 백준 2675번] 문자열 반복 (repeating character) 문제 해설 및 풀이 (Java, C++) 다양한 풀이 방법

반응형

오늘도 안녕하세요~~ 이어서 다음 문제를 볼까요?

 

출처:

백준 알고리즘 2675번,

ACM-ICPC 2011년 뉴욕 regional 기출 5800번

문제 분류: 문자열 사용하기

 

ACM-ICPC에서는 아래 사진과 같이 영어로 출제되었습니다.

정답률:

55.7%(백준 알고리즘 기준)

62.8%(ACM ICPC 기준)

문자열 반복, Repeating Charater

문제

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

예제 입력1

예제 출력1

2

3 ABC

5 /HTP

AAABBBCCC

/////HHHHHTTTTTPPPPP

같이 풀어보고 답을 비교해봐요!!

저의 코드는 수 많은 풀이 중 하나일뿐 최선은 아니랍니다 ㅠ 취사선택! 알죠?!ㅎㅎ


ANSWER

맨처음 문제만 힐끗 봤을 땐 무슨말인가 했는데,,,

예제를 보니 바로 이해할 수 있죠 ㅎㅎㅎ ㅎ

각 자리수를 해당 숫자만큼 반복하면 되는거니까 어려운 문제는 아닌 것 같네요.

음 각 자리수를 N배씩 한 후 한번에 이어 출력할 수 있겠고, 각 자리수마다 낑겨넣기 할 수도 있겠어요!

최대 문자열 길이를 알려줬으니 넉넉히 배열을 만든다음 차곡차곡 쌓을 수도 있겠네요.

여러분들은 어떻게 생각하셨나요?

JAVA언어 코드

[문자열 반복 JAVA - StringTokenizer & StringBuilder 새로 문자열 만들기]

오늘은 자바로 먼저 가볼게요! 먼저 StringTokenizer로 입력을 반복횟수와 문자열로 나누고, StringBuilder를 이용해서 요구사항에 맞게 새로 조합한 문자열을 반환하는 코드예요! 코드는 어렵지 않습니다.

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
class Main{
	public static int repeat;
	public static char[] str;
	public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int test_case = Integer.parseInt(br.readLine());
        for(int T=0; T<test_case; T++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            repeat = Integer.parseInt(st.nextToken());
            str = st.nextToken().toCharArray();
            
		    StringBuilder sb = new StringBuilder();
		    for(int i=0; i<str.length; i++) {
		    	for(int r = 0; r<repeat; r++)
		    		sb.append(str[i]);
	    	}		
		    System.out.println(sb.toString()); 
        }
        br.close();
    }
}

메모리: 12852KB

시간: 72ms

코드 길이: 880B

문자열을 편하게 조합하기 위해서 StringBuilder를 사용했는데요, 문자열의 기본은 원래 배열이였으니 배열로도 작성 가능하겠죠?

[문자열 반복 JAVA - split & array]

똑같은 코든데요, 매번 항상 제가 그렇듯이, 너무 똑같으면 지루하니까..ㅎㅎ

차이점으로 이번에는 StringTokenizer대신 split("")로 한 줄 라인을 파싱해봤어요 ㅎㅎ

이번에는 StringBuilder대신 배열을 선언해서 직접 넣어주는 방식으로 코드를 짰습니다!

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
class Main{
	public static int repeat;
	public static char[] str;
	public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int test_case = Integer.parseInt(br.readLine());
        for(int T=0; T<test_case; T++){
        	String[] line = br.readLine().split(" ");
 		    repeat = Integer.parseInt(line[0]);
 		    str = line[1].toCharArray();
            
            char[] charAry = new char[repeat * str.length];//이번에는 배열을 선언해줍시다.
            int index=0;
		    for(int i=0; i<str.length; i++) {
		    	for(int r =0; r<repeat; r++)
		    		charAry[index++]=str[i];
	    	}		
		    for(int i=0; i<charAry.length; i++)
		    	System.out.print(charAry[i]);
		    System.out.println();
        }
        br.close();
    }
}

메모리: 12944KB

시간: 76ms

코드 길이: 961B

[문자열 반복 JAVA - 이어서 출력하기~!]

고 다음 생각나는 풀이 방법 이어쓰기~

뭔가 결국 풀이가 다 거기서 거기..ㅎ 고냥 바로 반복할때마다 따따따다 출력하느냐, 아니면 문자열로 결합한 후 그 문자열을 출력하느냐 차이예요

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
class Main{
	public static int repeat;
	public static String str;
	public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int test_case = Integer.parseInt(br.readLine());
        for(int T=0; T<test_case; T++){
        	StringTokenizer st = new StringTokenizer(br.readLine());
        	repeat = Integer.parseInt(st.nextToken());
        	str = st.nextToken();
        	for(int i=0; i<str.length(); i++) {
        		for(int r=0; r<repeat; r++)
        			System.out.print(str.charAt(i));
        	}
        	System.out.println();
        }
        br.close();
    }
}

메모리: 12948KB

시간: 76ms

코드 길이: 837B

C++언어 코드

자바는 많이 봤으니 이제 C++코드로 한 번 더 풀어봅시다ㅎㅎ

#include<iostream>
#include<string>
using namespace std;
int main() {	
	int test_case, repeat; string input;
	cin >> test_case;
	for (int T = 0; T < test_case; T++) {
		cin >> repeat >> input;
		for (int i = 0; i < input.size(); i++) {
			for (int r = 0; r < repeat; r++) {
				cout << input.at(i);
			}
		}
		cout << "\n";
	}
	return 0;
}

제가 C/C++언어를 좀 더 선호하는 이유는 아마 이런 것도 한몫 하는 것 같아요.ㅎㅎ 너무 간결하게 코드가 구현되서 뭔가 깔끔한거?ㅎㅎ 

C언어 코드

똑같지만 string을 이용하지 않고 C기반의 문자열 배열을 이용해서 작성해본 코드!

#include <stdio.h>
int main()
{
	char str[20]; //20글자를 넘지 않는다
    int test_case, T, repeat, index; 
	scanf("%d", &test_case);
	for (T = test_case; T > 0; T--) {
		scanf("%d", &repeat);
		scanf(" %s", &str);
		for (index =0; str[index] != '\0'; index++)
		{
			for (int r = 0; r < repeat; r++)
				printf("%c", str[index]);
		}
		printf("\n");
	}
	return 0;
}

메모리: 1116KB

시간: 0ms

코드 길이 : 390B

오늘은 여기까지입니다!! 다들 해당 문제를 풀었기 때문에 이 포스팅을 마주하게 된 거라 추측(?)하는데 모두 문제 푸느라 수고했어요!!ㅎㅎ 또 방문 해주세요 여러분들 ♥

반응형