▶ 문제
https://www.acmicpc.net/problem/2908
2908번: 상수
상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자리 수 두
www.acmicpc.net
▶ 설명
두 수를 거꾸로 읽어서 비교하는 문제이다.
나는 한 번에 두 수를 문자열로 읽고서
자리배치를 거꾸로 바꾼 후
공백으로 두 문자를 나누는 방식으로 시작했다.
그 뒤 숫자로 변환하여서 최대값을 구하는 max() 메소드를 사용했다.
문자열을 거꾸로 하기 위해서는 두 가지 방법을 썼다.
1. StringBuilder의 reverse() 메소드 사용.
2. 문자열을 역순으로 byte 배열에 값을 준 후 다시 문자열로 변환.
▶ 문제 풀이
🌱 풀이1. 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 br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
StringBuilder sb = new StringBuilder(s);
sb.reverse();
StringTokenizer strTo = new StringTokenizer(sb.toString(), " ");
int a = Integer.parseInt(strTo.nextToken());
int b = Integer.parseInt(strTo.nextToken());
System.out.println(Math.max(a, b));
}
}
StringBuilder 클래스는 주로 출력할 때 많이 사용하였다.
그러다 보니 append() 메소드밖에 잘 안썼는데, reverse() 메소드가 떠올라서 이번 기회에 사용해보았다.
StringBuilder 를 인스턴스 할 때 어떤 문자열을 넣어 초기화 하면,
reverse() 메소드를 썼을 때 그 저장되어 있는 문자열의 순서를 거꾸로 나열된다.
예를 들어 StringBuilder sb = new StringBuilder("abcdefg") 로 새 인스턴스가 만들어질 때
sb.reverse() 하면 sb에는 "gfedcba" 로 문자가 거꾸로 바껴있게 된다.
reverse() 메소드는 StringBuilder 형으로 반환하기 때문에 바로 출력해서 보고자 할 때는 toString()을 사용해주어야 한다.
마찬가지로 StringTokenizer 의 생성자 인자로 String 형을 받기 때문에
StringTokenizer strTo = new StringTokenizer(sb, " ") 가 아니라
StringTokenizer strTo = new StringTokenizer(sb.toString(), " ") 인 것이다.
그렇게 문자열을 거꾸로 바꾼 후 두 수로 잘랐다면 max() 메소드로 최대값을 구해 출력해내면 된다.
🌱 풀이2. byte[ ]배열 사용
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 br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
byte[] reverseS = new byte[7];
for (int i = 0, j = 6; i < 7; i++, j--) {
reverseS[i] = s.getBytes()[j];
}
String newS = new String(reverseS);
StringTokenizer strTo = new StringTokenizer(newS, " ");
System.out.println(Math.max(Integer.parseInt(strTo.nextToken()), Integer.parseInt(strTo.nextToken())));
}
}
byte, char 어떤 것이든 배열로 한 글자씩 '입력된 문자열'을 받도록 한다.
자바에서는 byte 가 1byte, char가 2byte 크기를 가진다고 하여
크기면에서 효율적인 byte를 사용해보았다.
reverseS[i] = s.getBytes()[j]
반복문을 통해 문자열 s의 끝부터 reverseS 배열의 값으로 할당해주었다.
String newS = new String(reverseS)
그렇게 reverseS 에 문자들이 다 들어갔다면 byte 형에서 String 형으로 변환해 주도록 한다.
이 때 newS라는 새 문자열 변수가 만들어지게 된다.
거꾸로 뒤집혀진 문자가 만들어졌다면 그다음은 위의 풀이와 마찬가지로
정수로 변환한 후 비교하여 큰 수를 출력하도록 한다.
▶ Log
StringBuilder 클래스에도 String 못지않게 다양한 생성자와 메소드가 있기 때문에 잘 살펴보고 필요에 따라 유연하게 사용할 수 있어야겠다.
'백준 알고리즘 > 문자열' 카테고리의 다른 글
[JAVA 자바] 백준 2941번 : 크로아티아 알파벳 (1) | 2022.06.08 |
---|---|
[JAVA 자바] 배준 5622 : 다이얼 (0) | 2022.06.07 |
[JAVA 자바] 백준 1152번 : 단어의 개수 (0) | 2022.06.05 |
[JAVA 자바] 백준 1157번 : 단어 공부 (0) | 2022.06.04 |
[JAVA 자바] 백준 2675번 : 문자열 반복 (0) | 2022.06.03 |