답은 제대로 나오는데 메모리 초과가 발생했다.
이유를 찾아보니 형변환인데
나는 형변환을 사용하지 않았다.
아무래도 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;
위 코드를 추가하여 해결하였다.