Day1 - 문자열 반복해서 출력하기
📌 문제 정보
- 문제 이름 : 코딩 기초 테스트 - 문자열 반복해서 출력하기
- 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/181950
📌 문제 요약
- 핵심 조건: 문자열 str이 n번 반복된 문자열을 만들어 출력하는 코드 작성
- 제한: 1 ≤ str의 길이 ≤ 10, 1 ≤ n ≤ 5
📌 내 풀이 및 코드
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
int n = sc.nextInt();
String result = "";
int i;
for(i=1; i<=n; i++) {
result += str;
}
System.out.print(result);
}
}
- 틀렸었음. 출력문에 (str * n) 이라고 썼는데 String 타입은 * 연산자를 못 쓴다고 함.
- 어떤 방법이 있는지 힌트로 찾아봤고, for로 이어 붙이거나 StringBuilder를 사용하라고 했는데 StringBuilder 방식을 몰랐음.
📌 다른 사람들 풀이
//0
String result = "";
for (int i = 1; i <= n; i++) {
result += str;
}
//1
System.out.println(str.repeat(n));
//2
StringBuilder sb = new StringBuilder();
for(int i=0; i<n; i++){
sb.append(str);
}
String s = sb.toString();
System.out.println(s);
//3
for(int i=0;i<n;i++){
System.out.print(str);
}
<-- 다른 풀이 요약 -->
- 0 : 내 코드에서 최대한 줄여본 것. (for문 안에 i를 바로 선언할 수 있음!)
- 1 : 코드가 제일 짧고 가독성이 좋음. (하지만 String의 .repeat(n) 메서드는 Java 11이상부터 사용 가능)
- 2 : += 형식보다 훨씬 빠르고 repeat 못 쓰는 환경에서도 안전하며 실무에서 가장 많이 쓰는 패턴임.
(System.out.println 내부에서 문자열로 바꿔주기 때문에 System.out.println(sb); 로 해도 됨.)
- 3 : String 자체를 변수에 모아두지 않고 바로바로 출력하기 때문에 메모리를 거의 안 씀. (변수 저장 필요 없을 때 유용)
| 내 코드 | repeat() (1번) | StringBuilder (2번) | System.out.print 반복 (3번) | |
| 실행 결과 | 동일 | 동일 | 동일 | 동일 |
| 속도 | 느림 (+= 연산) | 빠름 | 빠름 | 빠름 |
| 메모리 | 새 문자열 계속 생성 | 내부 최적화 | 메모리 버퍼 재사용 | 거의 안 씀 |
| 가독성 | 보통 | 최고 (한 줄) | 좋음 | 짧고 직관 |
| 버전 제한 | 없음 | Java 11 이상 | 없음 | 없음 |
| 실무 적합성 | ❌ | ✅ | ✅ | 조건에 따라 가능 |
📌 새로 배운 문법
<-- 이번 문제에서 새로 배운 Java 문법 정리 -->
** Java11의 repeat() 함수 **
- Java 11에서 새로 추가된 String 메서드로, 문자열을 원하는 횟수만큼 반복해서 이어 붙여줌.
- 파라미터 0 => 빈 문자열 반환 / 파라미터 음수 => IllegalArgumentExceptionthrow 에러 반환 / 파라미터 1 => 지정 문자열 반환
- String result = str.repeat(n); (str = 반복할 문자열, n = 반복 횟수 (양수))
String s = "Hi!";
System.out.println(s.repeat(3)); // 결과: Hi!Hi!Hi!
**StringBuilder 사용법 **
- String 객체끼리 더할 때 덧셈 연산이 많아지면 메모리 할당과 해제를 발생시켜 성능적으로 좋지 않음.
(많은 문자열을 연결하면 많은 중간 문자열 객체가 생성되어 비효율적인 코드가 생성됨. -> 한 번 생성되면 내용 변경 불가)
- 그래서, 문자열을 효율적으로 여러 번 이어 붙일 때 쓰는 도구로 사용!! (문자열 덧붙이기에 특화된 도구)
- StringBuilder는 내부에 메모리 버퍼(공간)을 만들기 때문에 이어 붙일 때마다 새로 만들지 않고 버퍼에 덧붙임.
- append() = 덧붙이기 / toString() = 완성된 문자열로 변환
StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" ");
sb.append("World");
System.out.println(sb.toString()); // Hello World