Published:
Updated:


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