안녕하세요
백준 알고리즘 단계별로 풀어보기 7단계 상수를 풀어봤습니다
이번 문제는 보는 순간 reverse()를 사용해서 풀면 될 것 같다는 생각을 했습니다
reverse()와 이외에도 다른 방법으로 문제를 풀었는데 그 방법에 대해서 설명하겠습니다!
문제 링크입니다
https://www.acmicpc.net/problem/2908
문제
상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자리 수 두 개를 칠판에 써주었다. 그 다음에 크기가 큰 수를 말해보라고 했다.
상수는 수를 다른 사람과 다르게 거꾸로 읽는다. 예를 들어, 734와 893을 칠판에 적었다면, 상수는 이 수를 437과 398로 읽는다. 따라서, 상수는 두 수중 큰 수인 437을 큰 수라고 말할 것이다.
두 수가 주어졌을 때, 상수의 대답을 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 상근이가 칠판에 적은 두 수 A와 B가 주어진다. 두 수는 같지 않은 세 자리 수이며, 0이 포함되어 있지 않다.
출력
첫째 줄에 상수의 대답을 출력한다.
문제 풀이
첫 번째 방법은 split으로 배열로 나눈 다음 reverse()를 사용하여 글자를 반전시켜 값을 비교합니다
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
// BufferedReader 선언 및 split을 사용 배열로 입력
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] sb = br.readLine().split(" ");
// StringBuffer 선언 및 값 입력
StringBuffer strBufferA = new StringBuffer();
StringBuffer strBufferB = new StringBuffer();
strBufferA.append(sb[0]);
strBufferB.append(sb[1]);
// a, b를 reverse()를 사용하여 글자반전
int a = Integer.parseInt(strBufferA.reverse().toString());
int b = Integer.parseInt(strBufferB.reverse().toString());
// 비교 후 결과출력
if(a > b)
System.out.print(a);
else
System.out.print(b);
}
}
두 번째 방법은 StringTokenizer를 사용하여 값을 구분하고 reverse를 사용하여 글자를 반전시켜 값을 비교합니다
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
// BufferedReader 및 StringTokenizer 선언 및 입력
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
// a, b를 reverse()를 사용하여 글자 반전
int a = Integer.parseInt(new StringBuilder(st.nextToken()).reverse().toString());
int b = Integer.parseInt(new StringBuilder(st.nextToken()).reverse().toString());
// 비교 후 결과 출력
if(a > b)
System.out.print(a);
else
System.out.print(b);
}
}
세 번째 방법은 in.read()를 사용하여 값을 하나씩 받습니다
세 번째 받은 값은 * 100 // 두 번째 받은 값은 * 10 // 첫 번째 받은 값은 그대로 더하여 세 자리 값을 구합니다
세 자리 값을 두 번 구한 결과를 비교해 결과값을 출력합니다
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
// 배열 선언
int[] comp = new int[2];
// 세번째는 *100, 두번째는 *10, 첫번째는 더해서 세자리값을 차례로 계산
for(int i = 0; i < 2; i++) {
int a = System.in.read() - '0';
int b = System.in.read() - '0';
int c = System.in.read() - '0';
int line = System.in.read();
comp[i] = (c * 100) + (b * 10) + a;
}
// 비교 후 결과 출력
if(comp[0] > comp[1])
System.out.print(comp[0]);
else
System.out.print(comp[1]);
}
}
여기까지 제가 풀은 방식이었습니다
바로 속도 비교를 해보겠습니다
속도 비교
1 : split() 사용
2. nextToken() 사용
3. in.read() 사용
제 예상과는 다른 결과가 나왔습니다
저는 당연히 3번 방식이 메모리, 속도 다 빠를 줄 알았는데...
시간은 2번 방식, 3번 방식이 동일하게 나오고, 메모리는 2번 방식이 제일 빠르게 나왔습니다
보통 문자열 메서드가 메모리가 높게 나와서 당연히 3번 인줄 알았는데 reverse는 메모리에 부담이 적은 메서드인 것 같습니다
이상 백준 알고리즘 2908번 상수를 풀은 내용이었습니다
다음 문제 : 2021.05.18 - [알고리즘/알고리즘JAVA] - [백준알고리즘/문자열] 5622번 문제 : 다이얼(자바/JAVA)
이전 문제 : 2021.05.17 - [프로그래밍/JAVA] - [백준알고리즘/문자열] 1152번 문제 : 단어의 개수(자바/JAVA)
'알고리즘 > 알고리즘JAVA' 카테고리의 다른 글
[백준알고리즘/문자열] 2941번 문제 : 크로아티아 알파벳(자바/JAVA) (0) | 2021.05.19 |
---|---|
[백준알고리즘/문자열] 5622번 문제 : 다이얼(자바/JAVA) (0) | 2021.05.18 |
[백준알고리즘/문자열] 1157번 문제 : 단어 공부(자바/JAVA) (0) | 2021.05.16 |
[백준알고리즘/문자열] 2675번 문제 : 문자열 반복(자바/JAVA) (0) | 2021.05.15 |
[백준알고리즘/문자열] 10809번 문제 : 알파벳 찾기(자바/JAVA) (0) | 2021.05.15 |