728x90
※ 문제
1) 실패코드
나는 2번의 삽질 끝에 성공하였다.
첫 번째는 BigInteger를 활용해서 풀었는데 메모리 초과가 발생하였다. 이때까지만 해도 왜 메모리를 많이 잡는 지 이해하지 못하였다.
① Biginteger로 작성한 코드
import java.io.IOException;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
static ArrayList<BigInteger> list = new ArrayList<>();
static BigInteger num = new BigInteger("10");
public static void main(String[] args) throws IOException {
Scanner scan = new Scanner(System.in);
int count = scan.nextInt();
String inputData = scan.nextLine();
for(int i=0; i<count; i++) {
inputData = scan.nextLine();
String[] arr = inputData.split(" ");
BigInteger a = BigInteger.valueOf(Long.parseLong(arr[0]));
int b = Integer.parseInt(arr[1]);
System.out.println(a.pow(b).remainder(num));
}
}
}
두 번째 방법은 10대의 컴퓨터만 존재하기 때문에 1의 자릿 수만 필요하다는 것을 깨달았다. 그리고 작성한 코드이다.
하지만 메모리 초과가 발생하였다. 삽질을 엄청한 결과 String.valueof()에서 128MB를 초과하는 메모리를 사용했다.
② 1의 자릿수 방식으로 작성한 코드
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int count = scan.nextInt();
String inputData = scan.nextLine();
for(int i=0; i<count; i++) {
inputData = scan.nextLine();
String[] arr = inputData.split(" ");
int a = Integer.parseInt(arr[0]);
int b = Integer.parseInt(arr[1]);
int result = a;
for(int j=0; j<b-1; j++) {
result *= a;
for(int k=0; k<String.valueOf(result).length(); k++) {
result %= 10;
}
}
if(String.valueOf(result).substring(String.valueOf(result).length()-1).equals("0")) result = 10;
System.out.println(result);
}
}
}
2) 성공코드
위 실패 사례로 숫자 범위를 초과하는 큰 수를 계산하는 경우 메모리를 효율적으로 사용하기 위해서는 형 변환을 하지 않고 계산하는 것이 효율적이라는 것을 알았다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int count = scan.nextInt();
String inputData = scan.nextLine();
for(int i=0; i<count; i++) {
inputData = scan.nextLine();
String[] arr = inputData.split(" ");
int a = Integer.parseInt(arr[0]);
int b = Integer.parseInt(arr[1]);
int result = a;
// 주어진 a의 1의 자릿 수 구하기
for(int k=0; k < (int) (Math.log10(result)+1); k++) {
result %= 10;
}
// 거듭제곱 후 1의 자릿 수 구하기
for(int j=1; j<b; j++) {
result *= a;
result %= 10;
}
if(result == 0) result = 10;
System.out.println(result);
}
}
}
728x90
'자기계발 > 백준 문제 풀이' 카테고리의 다른 글
1406 자바 ] 에디터(풀이) (0) | 2022.09.01 |
---|---|
7568 자바 ] 덩치(풀이) (0) | 2022.09.01 |
10757 자바 ] 큰 수 A+B(풀이) (0) | 2022.09.01 |
11720 자바 ] 숫자의 합 (풀이) (0) | 2022.09.01 |
2108 자바 ] 통계학(풀이) (0) | 2022.09.01 |