BaekJoon1009 - 분산처리

[Java] BaekJoon1009 - 분산처리

BaekJoon1009

총 데이터의 개수는 항상 A의 B제곱의 형태로 들어오게 된다.

A B 제곱 결과 예제 결과
1 6 1^6 = 1 1
3 7 3^7 = 2187 7
6 2 6^2 = 36 6
7 100 7^100 = 3234(이하생략)1 1
9 635 9^635 = (이하생략)9 9

위의 표는, 예제의 입력 값을 계산한 결과와 예제 결과를 비교 한 표이다. 제곱 결과의 끝자리 수가 예제 결과에 입력된 것을 볼 수 있다.

숫자를 표현하는 것에 한계가 있기 때문에, 곱할때 마다 %10을 한 결과를 얻어 문제를 풀 수 있었다.

단, 문제 내에서 10번 컴퓨터가 존재하기 때문에, 결과가 0이 나올 경우 10번 컴퓨터로 갈 수 있도록 if문을 넣어주었다.

  • Scanner를 이용하여 처음 풀었을 당시의 코드:

    import java.util.Scanner;
      
    public class BaekJoon1009 {
      
      public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
      
        int t = scanner.nextInt();
      
        for (int i = 0; i < t; i++) {
          int answer = 1;
      
          int a = scanner.nextInt();
          int b = scanner.nextInt();
      
          for (int j = 0; j < b; j++) {
            answer = (answer * a) % 10;
            if (answer == 0) {
              answer = 10;
            }
          }
      
          System.out.println(answer);
        }
      
        scanner.close();
      }
    }
    

    첫 결과

    메모리 크기나 시간을 보면, 전혀 효율적이지 않은 결과가 나왔다.

  • BufferedReader와 StringTokenizer 를 조합하여 변경 한 코드:

    import java.io.*;
    import java.util.StringTokenizer;
      
    class Main {
      
      public static void main(String[] args) throws IOException {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
      
        int t = Integer.parseInt(bufferedReader.readLine());
      
        for (int i = 0; i < t; i++) {
          StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());
      
          int a = Integer.parseInt(stringTokenizer.nextToken());
          int b = Integer.parseInt(stringTokenizer.nextToken());
            
          System.out.println(result(a,b));
        }
      
        bufferedReader.close();
      }
        
      public static int result(int a, int b) {
        int answer = 1;
        for (int j = 0; j < b; j++) {
          answer = (answer * a) % 10;
          if (answer == 0) {
            answer = 10;
          }
        }
          
        return answer;
      }
    }
    
    • Scanner를 사용 했던 부분을 모두 BufferedReader로 변경하였고, 결과를 반환하는 for문 부분은 result메소드에 따로 분류 해, 코드를 조금 더 간결하게 변경 해 보았다. BufferedReader

      걸린 시간이나 메모리 부분에서 나아진 모습을 볼 수 있었다.