티스토리 뷰
문제
상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자리 수 두 개를 칠판에 써주었다. 그 다음에 크기가 큰 수를 말해보라고 했다.
상수는 수를 다른 사람과 다르게 거꾸로 읽는다. 예를 들어, 734와 893을 칠판에 적었다면, 상수는 이 수를 437과 398로 읽는다. 따라서, 상수는 두 수중 큰 수인 437을 큰 수라고 말할 것이다.
두 수가 주어졌을 때, 상수의 대답을 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 상근이가 칠판에 적은 두 수 A와 B가 주어진다. 두 수는 같지 않은 세 자리 수이며, 0이 포함되어 있지 않다.
출력
첫째 줄에 상수의 대답을 출력한다.
시행착오(Trial&Error)
51681672, 51681173 - 틀렸습니다
오타로 인해 '틀렸습니다.' 결과가 나왔다.
51681672, 51681173 -컴파일 에러
Main.java:17: error: incompatible types: StringBuffer cannot be converted to String
int a = Integer.parseInt(sb1);
^
Main.java:19: error: variable sb2 is already defined in method main(String[])
StringBuffer sb2 = new StringBuffer(st.nextToken());
^
Main.java:25: error: incompatible types: StringBuffer cannot be converted to String
int b = Integer.parseInt(sb2);
^
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
3 errors
error: incompatible types: StringBuffer cannot be converted to String
StringBuffer를 Integer.parseInt()로 바로 변환할 수 없다.
StringBuffer인스턴스를 toString()으로 String 타입으로 변환해야 한다.
풀이(Solution)
StringBuffer는 String과 달리 내용 변경이 가능하다.
BufferedReader로 문자열을 입력 받을 때, String 대신 StringBuffer 타입으로 값을 받았다.
상수가 수를 뒤집어서 읽는 바람에, 문자열 값을 변경해야 하기 때문이다.
출처 - [StringBuffer] StringBuffer클래스
734와 893을 칠판에 적었다면, 상수는 이 수를 437과 398로 읽는다.
입력 받은 두 수의 셋째 자리 수와 첫째 자리 수를 교환하는 작업을 반복하기 때문에 reverse라는 메서드를 작성하여 처리했다.
출처 - [변수와 메서드] 메서드의 작성
상수는 두 수중 큰 수인 437을 큰 수라고 말할 것이다.
StringBuffer는 equals()가 오버라이딩되어있지 않다.(주소 비교)
따라서, StringBuffer를 String으로 변환 후에 equals()로 비교해야 한다.
출처 -[StringBuffer] StringBuffer의 비교
하나의 메서드는 한 가지 기능만 수행하도록 작성해야 한다.
따라서, substring()처리와 Integer.parseInt()처리를 메서드 밖에서 처리해주었다.
비교 대상이 될 숫자로 만들어주기 위해 append메서드와 delete메서드를 사용했다.
출처 - [StringBuffer] StringBuffer클래스의 생성자와 메서드
코드
import java.io.*;
import java.util.StringTokenizer;
class Main {
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
br.close();
StringBuffer sb1 = new StringBuffer(st.nextToken());
StringBuffer sb2 = new StringBuffer(st.nextToken());
// 1. 뒤집기
sb1 = reverse(sb1);
sb2 = reverse(sb2);
// 2. 비교하기
int a = Integer.parseInt(sb1.toString());
int b = Integer.parseInt(sb2.toString());
if(a > b) {
System.out.println(a);
} else {
System.out.println(b);
}
} catch(IOException e) {}
}
static StringBuffer reverse(StringBuffer sb) {
String num1 = sb.substring(0, 1);
String num2 = sb.substring(1, 2);
String num3 = sb.substring(2);
sb.append(num3 + num2 + num1);
sb.delete(0, 3);
return sb;
}
}
'알고리즘 > 문제풀이 - 백준' 카테고리의 다른 글
[백준 2941번] 크로아티아 알파벳(JAVA) (0) | 2022.11.16 |
---|---|
[백준 5622번] 다이얼(JAVA) (0) | 2022.11.15 |
[백준 1152번] 단어의 개수(JAVA) (0) | 2022.11.13 |
[백준 1157번] 단어 공부(JAVA) (0) | 2022.11.12 |
[백준 2675번] 문자열 반복(JAVA) (0) | 2022.11.11 |