[BaekJoon] 1009번: 분산처리
main() 메서드
BufferedReader로 몇 줄을 입력할지를 t에 저장한다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
br.close()
List<T>
형 2차원 배열 input을 선언한다.
List<List<Integer>> input = new ArrayList<>(); // List<>형 2차원 배열
n줄까지 배열을 저장할 수 있도록 for문을 생성한다. 한줄씩 입력받을 때마다 input에 저장할 1차원 배열을 초기화시켜줘야 하기 때문에 똑같이 초기화해줘야 하는 StringTokenizer와 같이 for문 안에 넣어준다.
for (int i = 0; i < n; i++) {
List<Integer> tmp = new ArrayList<>(); // input 2차원 배열에 저장할 임시 1차원 배열
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
tmp.add(Integer.parseInt(st.nextToken()));
tmp.add(Integer.parseInt(st.nextToken()));
input.add(tmp);
}
각각 테스트 케이스에 대해 정수 a, b밖에 없으므로 for문을 한번 더 사용하지 않고, tmp 배열에 공백을 기준으로 입력한 값들을 넣어준다. 그 후 input에 1차원 배열을 추가해 준다. 1차원 배열이 여러개 있는 형태가 2차원 배열이기 때문이다.
for (int i = 0; i < n; i++) {
List<Integer> tmp = new ArrayList<>(); // input 2차원 배열에 저장할 임시 1차원 배열
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
tmp.add(Integer.parseInt(st.nextToken()));
tmp.add(Integer.parseInt(st.nextToken()));
input.add(tmp);
}
solution() 메서드
2차원 배열 input을 매개변수로 하는 solution() 메서드를 생성한다.
static void solution(List<List<Integer>> input) {}
a^b = a^b
1^6 = 1
3^7 = 2187
6^2 = 36
위 예제처럼 작은 수의 거듭제곱은 아무런 문제가 없지만, 7^100과 9^635와 같은 너무 큰 수는 코드로 표현하기에 무리가 있다. 이럴 때는 규칙을 찾아야 한다.
a^b = a^b에서 3을 예로 들었을 때
3^1 = 3
3^2 = 9
3^3 = 27
3^4 = 81
3^5 = 243
3^6 = 729
3^7 = 2187
b를 기준으로 (1, 5), (2, 6), (3, 7) 이렇게 4번을 주기로 끝자리 숫자들이 반복되는 것을 알 수 있다. 즉, 최대 4번까지만 제곱할 수 있게 해주면 된다.
solution() 메서드 안에 int형으로 줄마다 출력할 변수 tmpOutput, a, b를 선언한다.
- tmpOutput: 곱셉을 해야 하므로 초기값 1로 설정
- a: 입력받은 a 그대로의 값으로 설정
- b: 입력받은 b에 4를 나눈 나머지 값으로 설정 (최대 4번까지만 제곱할 수 있으니)
int tmpOutput = 1;
int a = list.get(0);
int b = list.get(1) % 4
int b = list.get(1) % 4
이 코드에서 b가 4로 나눈 나머지로 저장되었으므로 b가 0이 됐을 때 다시 b를 4로 저장한다. (4번을 주기로)
if (b == 0) {
b = 4;
}
b는 지수의 개념이니 그것을 for문으로 대체할 수 있다. 끝자리 수를 구하기 위한 10으로 나눈 나머지를 tmpOutput에 저장한다. 기억해야 할 건 끝자리를 구하는 것이 목적이다.
for (int j = 0; j < b; j++) {
tmpOutput = (tmpOutput * a) % 10;
}
for문을 돈 tmpOutput이 0일 때는 10번째 컴퓨터의 경우니 10을 저장한다.
if (tmpOutput == 0) { // 10번째 컴퓨터
tmpOutput = 10;
}
System.out.println(tmpOutput);
실행 결과
소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
public class B1009 {
// 컴퓨터는 총 10대 (1번 ~ 10번)
// 데이터 개수 -> a^b 형태
// 최대 4번까지 거듭제곱
// 10번째 컴퓨터에는 조건에 따라 10을 출력
static void solution(List<List<Integer>> input) {
for (List<Integer> list : input) {
int tmpOutput = 1;
int a = list.get(0);
int b = list.get(1) % 4;
if (b == 0) { // 원래의 b와 4의 나머지가 0이면 4를 넣어준다.
b = 4;
}
for (int j = 0; j < b; j++) {
tmpOutput = (tmpOutput * a) % 10;
}
if (tmpOutput == 0) { // 10번째 컴퓨터
tmpOutput = 10;
}
System.out.println(tmpOutput);
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
List<List<Integer>> input = new ArrayList<>(); // List<>형 2차원 배열
for (int i = 0; i < t; i++) {
List<Integer> tmp = new ArrayList<>(); // input 2차원 배열에 저장할 임시 1차원 배열
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
tmp.add(Integer.parseInt(st.nextToken())); // a
tmp.add(Integer.parseInt(st.nextToken())); // b
input.add(tmp);
}
solution(input);
br.close();
}
}
Leave a comment