백준 2908번 자바
https://www.acmicpc.net/problem/2908
문제 내용은 아래 더보기를 누르면 나온다.
알고리즘
3자리의 정수 A와 B를 첫 줄에 입력받는다. (A != B, A와 B는 서로 같지 않다)
만약 123을 입력받았으면 321 로 바꾼다.
두 수를 비교해서 큰 수를 출력한다.
1. 3자리의 정수 A와 B를 첫 줄에 입력받는다.
3. 각 정수의 자리를 바꾼다.
4. 두 수를 비교해서 큰 것을 출력한다.
풀이1
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class No_2908 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int A = switchChar(st.nextToken());
int B = switchChar(st.nextToken());
System.out.println(A > B ? A : B);
}
static int switchChar(String str) {
char[] arr = str.toCharArray();
char temp = arr[2];
arr[2] = arr[0];
arr[0] = temp;
String char_str = "" + arr[0] + arr[1] + arr[2];
return Integer.parseInt(char_str);
}
}
일단 3자리의 문자가 들어오면 첫 번째와 세 번째의 자리수를 바꿔주는 함수 switchChar(String str)을 만들었다.
고정적인 숫자가 들어온다는 점에서 이렇게 함수를 만들었다.
함수에서는 toCharArray() 메서드로 문자열을 char[]로 바꿔서 반환받아서 자리를 바꾼 값을 Integer 형변환을 통해 반환했다.
반환한 값을 삼항연산자로 출력했다.
삼항연산자는 (조건식) ? (true값) : (false값) 로 나타낸다.
조건식이 true일 때 (true값)을 보내고, false 일 때 (false값)을 보낸다.
if문을 간편하게 한 줄로 썻다고 보면 된다.
풀이2
package 문자열;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class No_2908 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int A = reverseChar(st.nextToken());
int B = reverseChar(st.nextToken());
System.out.println(Math.max(A, B));
}
static int reverseChar(String str) {
int number = Integer.parseInt(str);
return number%10*100 + number/10%10*10 + number/100;
}
}
풀이1과 원리는 같지만 함수와 출력 바뀌었다.
풀이1은 문자로 위치를 바꾸었다면 풀이2는 숫자로 위치를 바꾸어 계산했다.
1. 세 번째 자리를 첫 번째 자리로 바꾸는 계산
123 % 10 = 3
3 * 100 = 300
2. 두 번째 자리 계산
123 / 10 = 12
12 % 10 = 2
2 * 10 = 20
3. 첫 번째 자리를 세 번째 자리로 바꾸는 계산
123 / 100 = 1
이렇게 계산해서 전부 합치면 reverse된 숫자가 나오게 된다.
Math.max() 메서드는 큰 값을 출력하는 메서드이다.
풀이 1에서 적었던 삼항연산자가 이 메서드에 적용되어 있다.
그래서 좀 더 간편해보이려고 이 메서드를 사용해서 출력했다.
풀이3
import java.io.IOException;
public class No_2908 {
public static void main(String[] args) throws IOException {
int A = 0;
int B = 0;
A += System.in.read() - 48;
A += (System.in.read() - 48) * 10;
A += (System.in.read() - 48) * 100;
System.in.read();
B += System.in.read() - 48;
B += (System.in.read() - 48) * 10;
B += (System.in.read() - 48) * 100;
System.out.println(Math.max(A, B));
}
}
7자리를 입력받는 것이 맞으니까 원시 입력인 System.in.read()로 한 문자씩 받아서 사용한다.
저렇게 문자를 받으면 아스키 코드값으로 받기때문에 - 48 또는 - '0'을 하면 우리가 아는 정수값이 나오게 된다.
풀이4
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class No_2908 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int A = Integer.parseInt(new StringBuilder(st.nextToken()).reverse().toString());
int B = Integer.parseInt(new StringBuilder(st.nextToken()).reverse().toString());
System.out.println(Math.max(A, B));
}
}
StringBuilder는 문자열을 다루는 클래스로 많이 쓰이는데, 이 reverse()라는 메서드를 포함하고 있다.
reverse()를 사용하기 위해서는 StringBuilder를 생성과 동시에 값을 넣어줘야한다.
StringBuilder를 생성할 때 문자열을 바로 넣어서 생성이 가능한데, 만약 문자열이 아니라면 append() 메서드를 써서 값을 넣는다.
이 때 append()로 넣어진 값은 StringBuilder라는 타입으로 변환된다.
이렇게 저장된 값을 reverse() 라는 메서드로 뒤집는다. 그리고 StringBuilder 타입을 문자열로 반환시키기 위해 toString()을 쓴다.
문자열을 int타입으로 변환시키기 위해 Integer.parseInt()로 쓰면 끝이다.
참고
'코딩테스트 > Java - 백준' 카테고리의 다른 글
[백준] 2941번 - Java(자바) (0) | 2022.03.02 |
---|---|
[백준] 5622번 - Java(자바) (0) | 2022.02.27 |
[백준] 1152번 - Java(자바) (0) | 2022.02.21 |
[백준] 1157번 - Java(자바) (0) | 2022.02.17 |
[백준] 2675번 - Java(자바) (0) | 2022.02.14 |