백준 1009 메모리 초과에 대한

byeol·2022년 12월 29일
0

답은 제대로 나오는데 메모리 초과가 발생했다.
이유를 찾아보니 형변환인데
나는 형변환을 사용하지 않았다.

아무래도 BigInteger를 사용하지 않는 방법에 대해서 생각해봐야겠다.

a^b개의 데이터로
(1 ≤ a < 100, 1 ≤ b < 1,000,000)

import java.util.*;
import java.math.*;

class Main{
  public static BigInteger[] solution(int T, BigInteger[] arr){
    BigInteger[] answer = new BigInteger[T];
    BigInteger ten = new BigInteger("10");    
    for(int i=0;i<T;i++){
    
      answer[i] = arr[i].remainder(ten);
      }
   return answer;

  }
  public static void main(String[] args){
   Scanner kb = new Scanner(System.in);
   int T = kb.nextInt();
   BigInteger[] arr = new  BigInteger[T];
   for(int i=0;i<T;i++){
       String a = kb.next();
       int b = kb.nextInt();

       BigInteger aa = new BigInteger(a);

       arr[i] = aa.pow(b);
    }
  for(BigInteger x: solution(T,arr)) 
   System.out.println(x);
  }
}

이 문제는 계속 나누어서 1의 자리만 알면되기 때문에
A A때 1의 자리 구하기
(A
A 1의 자리) A의 1의 자리 구하기
(A
A A 1의 자리) A의 1의 자리 구하기
이렇 식으로 계속 나머지를 구하도록 하면 굳이 큰 수를 필요로 하지 않는다.

import java.util.*;


class Main{		
 public static int[] solution(int T, int[][] arr) {
	int[] answer =new int[T];
	for(int i=0;i<T;i++) {
		int a = arr[i][0];
		int b = arr[i][1];
		int remainder=1;
		//System.out.println("a="+a+",b="+b);
		for(int j=0;j<b;j++) {
			remainder*=a;
			String index_num="";
			do {
				remainder=remainder%10;
				//System.out.println(a+" "+remainder);
				index_num = String.valueOf(remainder);
			}while(index_num.length()>1);
		  if(remainder==0)
			  remainder=10;
		}
		
		answer[i]=remainder;		
	}	
	return answer;	 
 }	
 public static void main(String[] args){
   Scanner kb = new Scanner(System.in);
   int T = kb.nextInt();
   int[][] arr = new int[T][2];
   for(int i=0;i<T;i++) {
	   for(int j=0;j<2;j++) {
		   arr[i][j]=kb.nextInt();
	   }
   }
   for(int x : solution(T,arr))
	   System.out.println(x);
  }
}

따라서 위와 같이 하면 정답이다.

중간에 한번 틀렸는데 그 이유는 10의 경우 10이 나와야 하는데 나머지가 0인 나머지 계속 0이 나왔기 때문이다.
이 부분을

 if(remainder==0)
			  remainder=10;

위 코드를 추가하여 해결하였다.

profile
꾸준하게 Ready, Set, Go!

0개의 댓글