출처
백준 온라인 저지
https://www.acmicpc.net/problem/1009
문제
재용이는 최신 컴퓨터 10대를 가지고 있다. 어느 날 재용이는 많은 데이터를 처리해야 될 일이 생겨서 각 컴퓨터에 1번부터 10번까지의 번호를 부여하고, 10대의 컴퓨터가 다음과 같은 방법으로 데이터들을 처리하기로 하였다.
1번 데이터는 1번 컴퓨터, 2번 데이터는 2번 컴퓨터, 3번 데이터는 3번 컴퓨터,... ,
10번 데이터는 10번 컴퓨터, 11번 데이터는 1번 컴퓨터, 12번 데이터는 2번 컴퓨터,...
총데이터의 개수는 항상 ab개의 형태로 주어진다. 재용이는 문득 마지막 데이터가 처리될 컴퓨터의 번호가 궁금해졌다. 이를 수행해주는 프로그램을 작성하라.
입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그다음 줄부터 각각의 테스트 케이스에 대해 정수 a와 b가 주어진다. (1 ≤ a < 100, 1 ≤ b < 1,000,000)
풀이
입력받은 a를 b번 제곱 한 수의 마지막 자릿수를 출력하는 문제입니다.
하지만 b의 범위가 1 <= b < 1,000,000 정도로 크므로 무작정 제곱을 해버리면 자료형의 범위를 초과해버립니다.
BigInt를 이용하여 풀이를 해보았지만 이때는 시간 초과란 결과가 나왔습니다.
결국 제곱의 마지막 한 수를 출력해야 하므로 10이 넘을 때마다 10으로 나눈 나머지로 값으로 즉 제곱된 수의 끝자리 수로 같을 구하는 방법을 선택했습니다.
아래 수식을 살펴보면 규칙을 찾을 수 있습니다.
- 3^1, 3^2, 3^3....
3 | 9 | 27 | 81 | 243 | 729 | 2187 |
- 매번 3(a)씩 곱한 후 10으로 나눈 나머지 값
3 | 9 | 7(27) | 1(21) | 3 | 9 | 7(27) |
두 값 모두 일의 자리는 같으므로 아래 방식을 이용하여 정수 범위를 넘어가지 않게 하여 값을 구할 수 있습니다.
이때 10번 컴퓨터도 존재하는데 10 % 10의 나머지는 0이므로 따로 예외처리를 해주어야 합니다.
코드
const input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
let N = input.shift();
const result = input.map(v => {
const [a, b] = v.split(' ');
let pow = 1;
for (let j = 0; j < b; j++) {
pow = (pow * a) % 10;
}
return pow === 0 ? 10 : pow;
});
console.log(result.join("\n"));