문제 : boj13410
필요 알고리즘 개념
- 브루트포스
- 단과 항을 입력받아 구구단을 진행해 수를 구하고, 해당 수를 모두 뒤집은 것 중 가장 큰 값을 찾아야 한다.
※ 제 코드에서 왜 main 함수에 로직을 직접 작성하지 않았는지, 왜 Scanner를 쓰지 않고 BufferedReader를 사용했는지 등에 대해서는 '자바로 백준 풀 때의 팁 및 주의점' 글을 참고해주세요. 백준을 자바로 풀어보려고 시작하시는 분이나, 백준에서 자바로 풀 때의 팁을 원하시는 분들도 보시는걸 추천드립니다.
풀이
8단의 5개 항의 값은 8, 16, 24, 32, 40 이다. 이걸 전부 뒤집으면 8, 61, 42, 23, 4 이다.이 중 가장 큰 값은 61이므로 61을 출력해주면 답이 된다. 즉, N과 K를 입력으로 받아서 기본 곱셈으로 수를 구하고, 그걸 전부 뒤집을줄만 알면 풀 수 있는 문제이다.
기본적으로 생각해볼 수 있는 쉬운 방법은 구한 곱셈의 결과를 String 형태로 변환한 뒤 뒤집는 것이다. 자바에서는 다음과 같이 할 수 있다. (코드 [B])
int base = n*i;
String baseStr = String.valueOf(base);
int reverse = Integer.parseInt(new StringBuilder(baseStr).reverse().toString());
하지만 String으로 변환한 연산은 언제나 int형 자체로 연산하는 것 보다 비효율적이다. 다음과 같이도 숫자를 뒤집을 수 있다. (코드 [A])
int base = n*i;
int reverse = 0;
while (base != 0) {
reverse*=10;
reverse += base%10;
base/=10;
}
두 가지 방법 중 끌리는 방법으로 구현하면 된다. 다만 난이도가 올라가서 이와 같은 처리가 필요한 경우, 보통 String으로 연산하게 되면 시간초과가 나게 될 것이니, 이번 기회에 int 자체로 뒤집는 방법을 이해해두자
코드 [A] : github
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
private void solution() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
int max = 0;
for (int i = 1; i <= k; i++) {
int base = n*i;
int reverse = 0;
while (base != 0) {
reverse*=10;
reverse += base%10;
base/=10;
}
max = Math.max(max, reverse);
}
System.out.println(max);
}
public static void main(String[] args) throws Exception {
new Main().solution();
}
}
코드 [B] : github
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
private void solution() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
int max = 0;
for (int i = 1; i <= k; i++) {
int base = n*i;
String baseStr = String.valueOf(base);
int reverse = Integer.parseInt(new StringBuilder(baseStr).reverse().toString());
max = Math.max(max, reverse);
}
System.out.println(max);
}
public static void main(String[] args) throws Exception {
new Main().solution();
}
}
'PS > BOJ' 카테고리의 다른 글
[자바] 백준 19542 - 전단지 돌리기 (java) (0) | 2022.11.03 |
---|---|
[자바] 백준 1669 - 멍멍이 쓰다듬기 (java) (0) | 2022.11.02 |
[자바] 백준 21598 - SciComLove (java) (0) | 2022.11.02 |
[자바] 백준 7891 - Can you add this? (java) (0) | 2022.11.02 |
[자바] 백준 5524 - 입실 관리 (java) (0) | 2022.11.02 |
댓글