99클럽 코테 스터디 3일차 TIL + 문자열 반복

sun·2025년 1월 15일
0
post-thumbnail

오늘의 학습 키워드 및 문제

#문자열 #반복적결합
[백준] 문자열 반복
https://www.acmicpc.net/problem/2675

문제풀이

문제를 딱 보자마자 이건 StringBuilder를 이용해서 풀어야겠다고 생각했다!
왜? 출력할 때 문자열이 반복적으로 결합되어야 하니까!
후후.. 어제의 StringBuilder 공부를 이렇게 바로 써먹으니 기분이 좋았다.

하지만 5번만에 풀어냈으니..

나의 삽질 일대기 대공개

아래는 나의 의사코드이다. (의사코드[pseudocode] : 코드 구현 없이 절차만 정하는 것)
1. BufferedReader를 사용하여 테스트케이스 입력받기
2. 테스트케이스 반복문 시작
3. StringBuilder를 사용하여 문자열의 각 문자를 반복횟수만큼 더하는 반복문을 구현
4. 3번의 반복문이 끝나면 개행
5. 모든 반복문이 끝난 후 StringBuilder를 한번에 출력

첫번째 시도 (컴파일 에러) _다른방법 참고

3번을 구현하는 2중 for문 부분에서 "for-each not applicable to expression type" 라는 에러가 발생했다.
이 문장을 힐끔 보고는 아 향상된 for문은 2중 for문이 안되는건가? 이런 말도안되는 생각을 했다.

// 여러분은 뭐가 잘못되었는지 보이시죠..?><

			for(char c : s[1]) {
                for(int j=0; j<Integer.parseInt(s[0]); j++) {
                    result.append(c);
                }
            }

두번째 시도 (출력 형식이 잘못되었습니다)

첫번째 시도의 기적의 마인드를 가지고 코드 그대로인 상태에서 2중 for문 부분만 향상된 for문에서 일반 for문으로 구현하여 풀었다.
그랬더니 출력 형식이 잘못되었다는 결과가 나왔다. 띠용?
이때 나는 아, StringBuilder를 출력할 때는 toString()을 해주어야 하는 건가? 이런 생각을 했다.
찾아보니 이 말은 맞는말이기도 하고 틀린말이기도 하다.
StringBuilder 객체를 System.out.println()으로 출력할 때 해당 메서드가 내부적으로 toString() 메서드를 호출하기 때문에 명시적으로 호출하지 않아도 된다.
하지만 다른 곳에서는 toString()을 꼭 호출해주어야 의도한 결과가 나온다.

// 이 문제를 아신다면 여기서도 이상함을 눈치채셨을지도..><

			result.append("\n");
            System.out.println(result);

세번째 시도 (출력 형식이 잘못되었습니다)

예상했을 것이다.
두번째 시도의 코드에서 toString()만 추가하여 다시 제출했다.
결과는 뭐.. 똑같이 나왔다ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
이때 출력 형식이 잘못되었다는 말을 잘 생각해보았다.
내가 의도한 것과는 다르게 출력이 되었다는 것인데.. 코드를 잘 살펴보았더니
테스트케이스 반복문 안에서 2중 for문이 끝나고 개행을 append하고 println으로 출력했던 것이다.
즉, 개행을 두번 한 셈.. 호호

네번째 시도 (컴파일 에러)

개행을 두번 했다는 것을 알게 되어 테스트케이스 반복문이 끝나고 한번에 출력을 하도록 했는데 컴파일 에러가 발생했다.

// 여기서는 무엇이 잘못되었을까~요><

		for(int i=0; i<t; i++) {
            // 반복횟수와 문자열 입력
            String[] s = br.readLine().split(" ");
            
            StringBuilder result = new StringBuilder();
            // 문자열의 각 문자를 반복횟수만큼 더하도록 함
            for(int k=0; k<s[1].length(); k++) {
                for(int j=0; j<Integer.parseInt(s[0]); j++) {
                    result.append(s[1].charAt(k));
                }
            }
            result.append("\n");
        }
        System.out.println(result);

마지막 시도!

그렇다. 테스트케이스 반복문 위에 StringBuilder를 초기화 했어야했다.

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder result = new StringBuilder();
        
        // 테스트케이스 t
        int t = Integer.parseInt(br.readLine());
        
        for(int i=0; i<t; i++) {
            // 반복횟수와 문자열 입력
            String[] s = br.readLine().split(" ");
            
            // 문자열의 각 문자를 반복횟수만큼 더하도록 함
            for(int k=0; k<s[1].length(); k++) {
                for(int j=0; j<Integer.parseInt(s[0]); j++) {
                    result.append(s[1].charAt(k));
                }
            }
            result.append("\n");
        }
        System.out.println(result);
        br.close();
    }
}

다른방법

  1. 향상된 for문은 2중for문이 가능 (첫번째 시도 참고)
    첫번째 시도는 향상된 for문을 사용해서 2중 for문을 구혔했다가 컴파일 에러가 발생한 케이스였는데 사실, 향상된 for문은 2중 for문이 가능하다.
    그렇다면 나는 왜 컴파일 에러를 발생시켰을까.
    String을 char[] 타입으로 바꿔줄 toCharArray() 함수를 사용하지 않았기 때문이다.. (성공)
// 이렇게 사용했어야 했다..
// Integer.parseInt(s[0])를 변수화 했으면 더 가독성이 좋았을 것 같다.

			for(char c : s[1].toCharArray()) {
                for(int j=0; j<Integer.parseInt(s[0]); j++) {
                    result.append(c);
                }
            }

공부한 내용정리

  • 문자열을 이용하여 향상된 for문을 구현하려면 String을 char[]로 변환해주는 toCharArrary() 사용.
    (이거 두번째 쓴다.. 기억해)
  • 향상된 for문은 2중 for문이 가능.
  • System.out.println()으로 출력할 때 해당 메서드가 내부적으로 toString() 메서드를 호출.
profile
Please, Steadily

0개의 댓글

관련 채용 정보