백준 단계별 문제풀이 5단계 (문자열)
https://www.acmicpc.net/problem/2908
# 문제
상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자리 수 두 개를 칠판에 써주었다. 그 다음에 크기가 큰 수를 말해보라고 했다.
상수는 수를 다른 사람과 다르게 거꾸로 읽는다. 예를 들어, 734와 893을 칠판에 적었다면, 상수는 이 수를 437과 398로 읽는다. 따라서, 상수는 두 수중 큰 수인 437을 큰 수라고 말할 것이다.
두 수가 주어졌을 때, 상수의 대답을 출력하는 프로그램을 작성하시오.
# 예제
입력 : 두 수는 같지 않은 세 자리 수, 0이 포함되어 있지 않
734 893
출력
437
# 필요개념
이 문제를 풀 땐, 수를 입력받아 수의 순서를 반대로 뒤집어 크기를 비교해야한다. 그래서 입력을 정수가 아닌 String으로 받아야 한다고 생각했다. 어떻게 뒤집을까 고민하다가 StringBuffer와 StringBuilder에 있는 reverse 메소드가 생각나 써보기로 했다.
StringBuffer ? StringBuilder ?
stringBuffer은 StringBuilder와 함께 문자열을 관리하는 클래스이다. 이 둘은 String과 달리 문자열이 생성된 후 수정이 가능하다는 특징이 있다. 문자열은 수정이 불가능해 새로운 문자열을 생성해야 한다는 단점이 있다!
그렇다면 StringBuffer와 StringBuilder의 차이는 무엇일까 ? 둘의 차이는 동기화 여부에 있다. StringBuffer은 다중 스레드에서도 동기화를 지원하기 때문에 안전하게 처리가 가능하지만, StringBuilder은 동기화를 보장하지 않는다. 대신, 동기화처리때문에 StringBuffer가 StringBuilder보다 성능이 좋지 않다.
따라서 둘은 스레드에 안전한 프로그램이 필요한지 여부에 따라 다르게 사용하면 된다.
- StringBuffer : 스레드에 안전한 프로그램 필요할 때
- StringBuilder : 안전 여부가 관계 없을 때
StringBuffer 대표 메소드
StringBuffer 메소드 | 설명 |
append(char[] s, int offset, int a) | 문자배열의 offset부터 a개의 데이터를 문자열 끝에 추가 |
charAt(int idx) | 인덱스가 idx인 문자 반환 |
indexOf(String str) | str의 인덱스 위치 반환 |
insert(int offset, a) | offset 위치에 a 삽입 (타입은 상관x) |
length() | 문자열 길이 반환 |
replace(int s, int e, String str) | s에서 e의 문자열을 str로 대체 |
reverse() | 문자열의 역순으로 된 문자열 반환 |
StringBuffer와 StringBuilder의 메소드는 비슷하다고 보면 된다. 난 여기서 reverse 메소드를 사용해 문제를 풀었다.
# Code
StringBuffer 사용
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
String s1 = st.nextToken();
String s2 = st.nextToken();
StringBuffer sb1 = new StringBuffer(s1);
StringBuffer sb2 = new StringBuffer(s2);
int a = Integer.parseInt(sb1.reverse().toString());
int b = Integer.parseInt(sb2.reverse().toString());
System.out.println(a > b ? a : b);
}
}
StringBuilder 사용
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
String s1 = st.nextToken();
String s2 = st.nextToken();
StringBuilder sb1 = new StringBuilder(s1);
StringBuilder sb2 = new StringBuilder(s2);
int a = Integer.parseInt(sb1.reverse().toString());
int b = Integer.parseInt(sb2.reverse().toString());
System.out.println(a > b ? a : b);
}
}
# 결과
비교결과 메모리와 시간 모두 StringBuilder가 뛰어나다는 것을 알 수 있다!
'코딩테스트 > 백준 브론즈,실버' 카테고리의 다른 글
[백준] 2751 : 수 정렬하기 (Collections.sort()와 Arrays.sort()) - JAVA (1) | 2024.01.27 |
---|---|
[백준] 10951 : A + B (EOF 처리하기) - JAVA (1) | 2024.01.26 |
[백준] 9506 : 약수들의 합 (List 활용) - JAVA (1) | 2024.01.23 |
[백준] 2501 : 약수 구하기 (StringTokenizer 활용하기) - JAVA (1) | 2024.01.23 |
[백준] 11005 : 진법 변환2 (Stack활용하기, String으로 변환) - JAVA (1) | 2024.01.21 |