StringBuilder
- StringBuilder은 문자열을 합치거나 변경할 때 사용하는 클래스다.
- 내부적으로 char배열을 가지고 있으며 문자열을 추가하거나 변경하면서 크기가 자동으로 지정된다.
- 문자열을 반복적으로 추가하거나 변경 할 때 성능상의 이점을 가져올 수 있다.
System.out.print
- System.out.print은 화면상에 출력하는 기능을 제공하는 메서드
- → 호출 할 때 마다 문자열을 매번 새로 생성하고 화면에 출력한다
- → 이 과정에서 메모리 할당 및 해제 I/O작업들이 발생하여 성능 부담이 발생
결론적으로, StringBuilder 를 사용하여 문자열을 생성하고 마지막에 toString 메서드를 호출하여 문자열을 한 번에 출력하는 것이 System.out.print 를 반복적으로 호출하는 것보다 훨씬 효율적이다.
다음 문제를 확인해보면 그 이유를 더욱 명확하게 파악할 수 있다.
[BaekJoon] 15651. N과 M (3)
- 다음과 같은 순서로 설명을 진행하겠다.
1. 기존 코드(시간 초과)
import java.util.Scanner;
public class BOJ_15651_N과M {
static int N;
static int M;
// static int cards[];
static int result[];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
M = sc.nextInt();
// cards = new int[N];
result = new int[M];
// for (int i = 0; i < N ; i++) {
// cards[i] = i+1;
// }
comb(0);
}
private static void comb(int cnt) {
if(cnt == M){
for (int i = 0; i < M; i++) {
System.out.print(result[i] +" ");
}
System.out.println();
return;
}
for (int i = 0; i <N; i++) {
result[cnt] = i+1;
comb(cnt +1 );
}
}
}
2.최종 수정 코드 (통과)
최종 수정 코드
- StringBuilder은 문자열을 합치거나 변경할 때 사용하는 클래스다.
- 내부적으로 char배열을 가지고 있으며 문자열을 추가하거나 변경하면서 크기가 자동으로 지정된다.
- 문자열을 반복적으로 추가하거나 변경 할 때 성능상의 이점을 가져올 수 있다.
- System.out.print은 화면상에 출력하는 기능을 제공하는 메서드
- → 호출 할 때 마다 문자열을 매번 새로 생성하고 화면에 출력한다
- → 이 과정에서 메모리 할당 및 해제 I/O작업들이 발생하여 성능 부담이 발생
결론적으로, StringBuilder 를 사용하여 문자열을 생성하고 마지막에 toString 메서드를 호출하여 문자열을 한 번에 출력하는 것이 System.out.print 를 반복적으로 호출하는 것보다 훨씬 효율적이다.
import java.util.Scanner;
public class BOJ_15651_N과M {
static int N;
static int M;
// static int cards[];
static StringBuilder sb = new StringBuilder();
static int result[];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
M = sc.nextInt();
// cards = new int[N];
result = new int[M];
// for (int i = 0; i < N ; i++) {
// cards[i] = i+1;
// }
comb(0);
System.out.println(sb);
}
private static void comb(int cnt) {
if(cnt == M){
for (int i = 0; i < M; i++) {
sb.append(result[i] + " ");
}
sb.append("\n");
return;
}
for (int i = 0; i <N; i++) {
result[cnt] = i+1;
comb(cnt +1 );
}
}
}
'CS' 카테고리의 다른 글
빌더 패턴(Builder Pattern) (0) | 2023.07.23 |
---|---|
Java Optional이란? (0) | 2023.07.23 |
LinkedList와 ArrayList의 속도차이 및 용도 (0) | 2023.07.13 |
FrameWork VS Library 차이점 (0) | 2023.07.13 |