BOJ

[백준 2908/JAVA] 상수 | StringBuffer와 StringBuilder의 차이

syj0522 2024. 3. 9. 22:33

문제

백준 2908번
두 상수를 입력받고, 상수를 거꾸로 뒤집은 후 대소비교하여 큰 수를 출력하는 문제이다.

- StringBuffer을 사용해서 구현했지만 StringBuilder을 사용하는 것이 더 적절. Note참고

풀이 : StringBuffer의 reverse()

문자열 A, B를 String으로 받는다.
A, B를 StringBuffer 객체로 선언하고 reverse()를 사용해 문자열을 뒤집은 후 다시 String객체로 변환한다.
해당 String객체를 다시 정수로 변환한 후 revA, revB에 저장한다.

revA, revB 대소비교 후 큰 수를 출력한다.

 

타입 변환 : String -> StringBuffer(reverse()를 사용하기 위해) -> String(parseInt()를 사용하기 위해) -> int

코드

//코드 1-1

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        String A = st.nextToken();
        String B = st.nextToken();

        StringBuffer sb1 = new StringBuffer(A);
        StringBuffer sb2 = new StringBuffer(B);

        int revA = Integer.parseInt(sb1.reverse().toString());
        int revB = Integer.parseInt(sb2.reverse().toString());

        bw.write((revA>revB?revA:revB) + " ");
        bw.close();
    }
}

선언 횟수를 줄여서 코드를 더 간결하게 만들면 아래와 같다.

//코드 1-2

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int revA = Integer.parseInt(new StringBuffer(st.nextToken()).reverse().toString());
        int revB = Integer.parseInt(new StringBuffer(st.nextToken()).reverse().toString());

        bw.write((revA>revB?revA:revB) + " ");
        bw.close();
    }
}


위 - 코드 1-2
아래 - 코드 1-2


선언 횟수를 줄이니 성능이 좋아졌다.

Note

  • StringBuffer vs StringBuilder?
  • 단일 스레드는 보통 StringBuilder를 사용한다.
    • StringBuilder와 StringBuffer는 둘 다 문자열을 저장하고 조작하는데 사용하는 클래스이고, 지원하는 메서드도 같다.
    • 다만 StringBuffer는 멀티스레드 환경에서 동기화를 지원하고 StringBuilder는 동기화를 지원하지 않는다는 점에서 차이가 있다.
    • 따라서 연산이 많은 경우, 프로그램이 스레드에 안전해야 하는 경우 StringBuffer를 쓰는 것이 권장된다.
    • 보통 멀티 스레드와 상관없는 경우에는 StringBuilder을 사용한다.
    • 이번 문제의 경우 StringBuilder을 사용하는 것이 적절하다.
  • String과의 차이점은 여기 참고