백준이당

[JAVA] 백준 1009 : 분산처리

이히당 2023. 5. 31. 11:52

https://www.acmicpc.net/problem/1009

 

1009번: 분산처리

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트 케이스에 대해 정수 a와 b가 주어진다. (1 ≤ a < 100, 1 ≤ b < 1,000,000)

www.acmicpc.net

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

public class Main {
	public static void main(String[] args) {
			Scanner sc = new Scanner(System.in);
				int[][] powArr = {{1}, {2,4,8,6}, {3,9,7,1}, {4,6}, {5},{6},
						{7,9,3,1},{8,4,2,6},{9,1},{10}};
				int T = sc.nextInt();
				int[] a = new int[T];
				int[] b = new int[T];
				
				for (int i = 0; i<T; i++) {
					a[i] = sc.nextInt();
					b[i] = sc.nextInt();
					a[i]  = (a[i] % 10 == 0) ? 10 : a[i] % 10;
				}
				
				for(int i = 0; i<T; i++) {
					int modRst = b[i] % powArr[a[i]-1].length;
					if (modRst == 0) {
						modRst = powArr[a[i]-1].length-1;
						
					} else {
						modRst--;
					}
					System.out.println(powArr[a[i]-1][modRst]);
				}
				
	}
}

처음엔 BigInteger로 그냥 계산해서 나머지를 구하면 되겠지..라고 생각했지만, 배열을 너무 많이 써야해서 '메모리초과'가 난다.

결국 어쩔수없이 제곱승했을때 나오는 수의 일의 자리 기준으로 2차원배열을 먼저 만들어 줬다 : powArr

배열 a에 일의자리로만 구성해주기 위해 나머지 연산을 사용하고, 이 문제에서는 10번 컴퓨터까지 쓴다는 것을 고려해 삼항연산자로 나머지가 0인 경우에는 10번 컴퓨터를 쓰겠다고 했다.

modRst는 2차원배열에서 최종 원소의 위치를 가리키기위해 만듦. 

나눠떨어졌을 때에는 0으로 두면 안되므로 조건문으로 값을 조정해주는 과정을 거쳐 출력하면 된다. (이것도 삼항연산자로 쓰면 더 간결하겠네)

 

근데 꼭 powArr를 만들어줘야할까..? 메모리초과만 안나면 좋겠는데 굳이 저렇게 배열을 만들어준게 너무나도 마음에 안든다. 아니 쉬워보였는데 자꾸 반례가 계속나와서 미치는줄알았네

 

728x90