백준 알고리즘 1009번 문제입니다.
간단하게 생각해보면 A에 B제곱을 구하여 뒷자리만 가져오면 됩니다.
이때, 뒷자리가 0이면 10으로 바꿔주면 됩니다.
그리고 숫자를 표한할 수 있는 자리수가 정해져 있기 때문에 제곱을 구할때 마다 10으로 나눈 나머지만 가지고 계산을 합니다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int T = s.nextInt();
int a,b,r;
for(int j=0;j<T;j++) {
a=s.nextInt();
b=s.nextInt();
r=1;
for (int i=0;i<b;i++) r=(r*a)%10;
if(r==0) r=10;
System.out.println(r);
}
s.close();
}
}
이렇게 풀게 되면 메모리와 시간은 아래와 같습니다.
여기에 소스를 조금만 더 추가해 준다면 시간은 훨씬 줄어들게 됩니다.
우선, 1~10까지의 숫자들의 제곱을 보면,
1,5,6,10의 제곱의 뒷자리는 항상 같고,
4와 9는 짝수제곱과 홀수제곱의 뒷자리가 같습니다.
나머지 2,3,7,8은 1제곱과 5제곱, 2제곱과 6제곱의 마지막자릿수가 같은걸 알 수 있습니다.
이것을 이용하여 소스를 조금 수정하면 다음과 같습니다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int T = s.nextInt();
for(int j=0;j<T;j++) {
int a=s.nextInt();
int b=s.nextInt();
int c=0;
int answer=1;
if(a%10 == 0 || a%10 == 1 || a%10 == 5 || a%10 == 6) {
answer=a%10;
}else if(a%10 == 4 || a%10 == 9) {
c = b%2;
if (c==0) c=2;
}else {
c = b%4;
if (c==0) c=4;
}
for (int i=0;i<c;i++) answer=(answer*a)%10;
if (answer==0) answer = 10;
System.out.println(answer);
}
s.close();
}
}
a가 0,1,5,6 일경우 a의 값을 바로 집어넣고, 나머지 숫자는 2또는 4로 나눈 나머지를 구하여 for문으로 뒷자리를 구합니다.
답이 0일경우 10으로 교체를 해주고 출력을 해주면 끝입니다!
채점을 해보면 시간이 훨씬 줄어든 것을 볼 수 있습니다!!!
'프로그래밍 > 백준알고리즘' 카테고리의 다른 글
백준 알고리즘 2839번 문제 - 설탕 배달 (0) | 2019.08.01 |
---|---|
백준 알고리즘 1978 문제 풀이 - 소수 찾기 (0) | 2019.07.30 |
백준 알고리즘 1712문제 풀이 - 손익분기점 (0) | 2019.07.30 |
백준 알고리즘 4948 문제 풀이 (java) - 베르트랑 공준 (0) | 2019.07.24 |
백준 알고리즘 2581번 문제 풀이 (c언어, 자바) (0) | 2019.07.24 |