#문자열 #반복적결합
[백준] 문자열 반복
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();
}
}
// 이렇게 사용했어야 했다..
// Integer.parseInt(s[0])를 변수화 했으면 더 가독성이 좋았을 것 같다.
for(char c : s[1].toCharArray()) {
for(int j=0; j<Integer.parseInt(s[0]); j++) {
result.append(c);
}
}