Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

어리바리 신입 개발자의 얼렁뚱땅 개발 기록 ✨

[ Java / 백준 2675 ] 문자열 문자 단위로 반복해서 출력하기 본문

Back - end/JAVA

[ Java / 백준 2675 ] 문자열 문자 단위로 반복해서 출력하기

낫쏘링 2023. 9. 11. 14:23
728x90
[ 문제 ]
1. 첫 번째 줄에는 문자열을 입력 받을 횟수를 받는다.
2. 두 번째 줄에는 문자열을 문자 단위로 반복하는 횟수 + 공백 + 문자열을 받는다.
3. 출력은 문자 단위로 입력 받은 만큼 반복하는 방식으로 수정된 문자열만 출력하되 각 문자열은 개행해서 출력한다.

[ 예시 - 입력 형태 ]
2
3 ABC
5 /HTP

[ 예시 - 출력 형태 ]
AAABBBCCC
/////HHHHHTTTTTPPPPP

기본적으로 for문과 charAt를 이용해서 코드를 작성하고 조금씩 다르게 총 4가지로 수정해봤는데 크게 차이는 없는 듯 하다.

 

[ 1. BufferedWriter의 write() 이용해서 바로 담기 ]

속도 : 124 ms
BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter (new OutputStreamWriter(System.out));

// 첫 번째 줄에서 int 타입으로 문자열 몇 개 입력 받을지 입력 받기
int inputNum = Integer.valueOf(br.readLine());

// for문 안에서 입력 받은 만큼 문자열을 입력 받고 for문 안에서 문자 반복 출력하기
for(int i = 0; i < inputNum; i += 1) {
    // 두 번째 줄에서는 공백을 기준으로 문자를 반복할 횟수와 문자열을 받을 예정
    // StringTokenizer로 공백을 기준으로 둘을 int와 String으로 나누어준다.
    StringTokenizer st = new StringTokenizer(br.readLine());
    int repeatNum = Integer.valueOf(st.nextToken());
    String repeatStr = st.nextToken();

    // charAt()를 이용해서 문자열의 각 인덱스를 반복해준다.
    for(int j = 0; j < repeatStr.length(); j += 1) {
        for(int k = 0; k < repeatNum; k += 1) {
            bw.write(String.valueOf(repeatStr.charAt(j)));            			
        }
    }
    // 문자열 마다 개행
    bw.write("\n");    
}
bw.flush();
bw.close();
br.close();

 

[ 2. StringBuffer 이용해서 문자열 연결해주고 write()에 담기 ]

속도 : 124 ms (코드만 더 길어지고 속도 차이는 없긴 하다...)
BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter (new OutputStreamWriter(System.out));

// 첫 번째 줄에서 int 타입으로 문자열 몇 개 입력 받을지 입력 받기
int inputNum = Integer.valueOf(br.readLine());

// for문 안에서 입력 받은 만큼 문자열을 입력 받고 for문 안에서 문자 반복 출력하기
for(int i = 0; i < inputNum; i += 1) {
	// 두 번째 줄에서는 공백을 기준으로 문자를 반복할 횟수와 문자열을 받을 예정
    // StringTokenizer로 공백을 기준으로 둘을 int와 String으로 나누어준다.
    StringTokenizer st = new StringTokenizer(br.readLine());
    int repeatNum = Integer.valueOf(st.nextToken());
    String repeatStr = st.nextToken();

    StringBuffer sb = new StringBuffer();
    
    // charAt()를 이용해서 문자열의 각 인덱스를 반복해준다.
    for(int j = 0; j < repeatStr.length(); j += 1) {
        char c = repeatStr.charAt(j);
        for(int k = 0; k < repeatNum; k += 1) {
            // StringBuffer에서는 문자열을 append()를 통해 붙여준다.
            sb.append(c);
        }
    }
    bw.write(sb.toString()); 
        
    // 문자열 마다 개행
    bw.write("\n");    
}
bw.flush();
bw.close();
br.close();

 

[ 3. String 클래스의 repeat() 메서드 활용하기 ]

속도 : 120 ms (속도가 미세하게 빨라지고 for문도 세 번에서 두 번으로 덜 쓸 수 있다.)
BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter (new OutputStreamWriter(System.out));

// 첫 번째 줄에서 int 타입으로 문자열 몇 개 입력 받을지 입력 받기
int inputNum = Integer.valueOf(br.readLine());

// for문 안에서 입력 받은 만큼 문자열을 입력 받고 for문 안에서 문자 반복 출력하기
for(int i = 0; i < inputNum; i += 1) {
    // 두 번째 줄에서는 공백을 기준으로 문자를 반복할 횟수와 문자열을 받을 예정
    // StringTokenizer로 공백을 기준으로 둘을 int와 String으로 나누어준다.
    StringTokenizer st = new StringTokenizer(br.readLine());
    int repeatNum = Integer.valueOf(st.nextToken());
    String repeatStr = st.nextToken();
    
    for(int j = 0; j < repeatStr.length(); j += 1) {
        // repeat() 메서드는 String 클래스에서 제공하기 때문에 
        // char 타입은 String으로 변환해줘야 쓸 수 있다.
        // bw.write(String.valueOf(repeatStr.charAt(j)).repeat(repeatNum)); 처럼 바로 갖다 넣을 수 도 있지만,
        // 지저분해서 변수에 담아서 넣어줬다.
        String c = String.valueOf(repeatStr.charAt(j));
        bw.write(c.repeat(repeatNum));
    }        
    // 문자열 마다 개행
    bw.write("\n");    
}
bw.flush();
bw.close();
br.close();

 

[ 4. String 클래스의 repeat() 메서드와 toCharArray() 메서드 활용하기 ]

속도 : 120 ms (코드가 살짝 짧아지긴 했지만 속도도 그렇고 별 차이는 없긴 하다...)
BufferedReader br = new BufferedReader (new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter (new OutputStreamWriter(System.out));

// 첫 번째 줄에서 int 타입으로 문자열 몇 개 입력 받을지 입력 받기
int inputNum = Integer.valueOf(br.readLine());

// for문 안에서 입력 받은 만큼 문자열을 입력 받고 for문 안에서 문자 반복 출력하기
for(int i = 0; i < inputNum; i += 1) {
    // 두 번째 줄에서는 공백을 기준으로 문자를 반복할 횟수와 문자열을 받을 예정
    // StringTokenizer로 공백을 기준으로 둘을 int와 String으로 나누어준다.
    StringTokenizer st = new StringTokenizer(br.readLine());
    int repeatNum = Integer.valueOf(st.nextToken());
    String repeatStr = st.nextToken();
    
    // toCharArray() 메서드는 문자열을 char 타입으로 하나 씩 떼어내 배열에 담아준다.
	for(char c : repeatStr.toCharArray()) {
        // repeat() 메서드는 String 클래스에서 제공하기 때문에 
        // char 타입은 String으로 변환해줘야 쓸 수 있다.
        // bw.write(String.valueOf(c).repeat(repeatNum)); 처럼 바로 갖다 넣을 수 도 있지만,
        // 지저분해서 변수에 담아서 넣어줬다.
        String sToc = String.valueOf(c);
        bw.write(sToc.repeat(repeatNum));
    }     
    // 문자열 마다 개행
    bw.write("\n");    
}
bw.flush();
bw.close();
br.close();

 

참고로 개행할 때 bw.write("\n")를 사용하는 것 보다 bw.newLine()을 사용해주면 플랫폼 독립성에 좋다고 한다.
유닉스와 리눅스 환경에서는 개행할 때 \n 을 사용하지만 윈도우 환경에서는 \r\n를 사용하기 때문이다.
또, repeat()을 사용하면 for문 중첩은 줄겠지만 쓸 데 없이 형변환 과정을 거쳐야 한다는 의견도 있다. 코드의 가독성, 유지보수, 속도 등을 생각해 적당한 방법을 선택해서 사용하면 될 듯 하다.
728x90