본문 바로가기
PS/BOJ

[자바] 백준 13410 - 거꾸로 구구단 (java)

by Nahwasa 2022. 11. 2.

 문제 : 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();
    }
}

댓글