백준 1009번

백준 1009번은 c언어의 제곱 기능에 대한 문제이다. 문제에서 요구하는 것은 지수와 밑을 입력받은 후, 거듭제곱한 수의 1의 자리 수이다. 그래서 처음에는 무지성(?)으로 바로 제곱함수를 구해 10으로 나눈 나머지를 구하려고 했지만, b의 범위 자체가 넓었기 때문에 제곱으로 프로그램을 만들어버리면 숫자가 엄청 길어져버렸다. 그래서 기본적인 규칙을 찾고자 약간의 연산을 진행해 보았다.

역시나 숫자에 따라 1의 자리 숫자로 나타나는 규칙이 있다는 것을 알게 되었다. 그 규칙은 다음과 같다:

1의 제곱 -> 1(1^1), 1(1^1) ...

2의 제곱 -> 2(2^1), 4(2^2), 8(2^3), 6(2^4), 2(2^5) ...

3의 제곱 -> 3(3^1), 9(3^2), 7(3^3), 1(3^4), 3(3^5) ...

4의 제곱 -> 4(4^1), 6(4^2), 4(4^3) ...

5의 제곱 -> 5(5^1), 5(5^2) ...

6의 제곱 -> 6(6^1), 6(6^2) ...

7의 제곱 -> 7(7^1), 9(7^2), 3(7^3), 1(7^4), 7(7^5) ...

8의 제곱 -> 8(8^1), 4(8^2), 2(8^3), 6(8^4), 8(8^5) ...

9의 제곱 -> 9(9^1), 1(9^2), 9(9^3) ...

이러한 규칙에 따라서 코드를 짜 보았다:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
	int num;
	scanf("%d", &num);
	int a, b;
	for (int i = 0; i < num; i++) {
		scanf("%d %d", &a, &b);
		int remain = 0;
		switch (a) {
		case 1:
			printf("%d\n", 1);
			break;
		case 2:
			remain = b % 4;
			switch (remain) {
			case 1:
				printf("%d\n", 2);
				break;
			case 2:
				printf("%d\n", 4);
				break;
			case 3:
				printf("%d\n", 8);
				break;
			case 0:
				printf("%d\n", 6);
				break;
			}
			break;
		case 3:
			remain = b % 4;
			switch (remain) {
			case 1:
				printf("%d\n", 3);
				break;
			case 2:
				printf("%d\n", 9);
				break;
			case 3:
				printf("%d\n", 7);
				break;
			case 0:
				printf("%d\n", 1);
				break;
			}
			break;
		case 4:
			remain = b % 2;
			switch (remain) {
			case 1:
				printf("%d\n", 4);
				break;
			case 0:
				printf("%d\n", 6);
				break;
			}
			break;
		case 5:
			printf("%d\n", 5);
			break;
		case 6:
			printf("%d\n", 6);
			break;
		case 7:
			remain = b % 4;
			switch (remain) {
			case 1:
				printf("%d\n", 7);
				break;
			case 2:
				printf("%d\n", 9);
				break;
			case 3:
				printf("%d\n", 3);
				break;
			case 0:
				printf("%d\n", 1);
				break;
			}
			break;
		case 8:
			remain = b % 4;
			switch (remain) {
			case 1:
				printf("%d\n", 8);
				break;
			case 2:
				printf("%d\n", 4);
				break;
			case 3:
				printf("%d\n", 2);
				break;
			case 0:
				printf("%d\n", 6);
				break;
			}
			break;
		case 9:
			remain = b % 2;
			switch (remain) {
			case 1:
				printf("%d\n", 9);
				break;
			case 0:
				printf("%d\n", 1);
				break;
			}
			break;
		}
	}
	return 0;
}

하지만, 기본적으로 Switch문으로 짰기 때문에 오류가 생기는 것을 제출할 때까지는 몰랐다. 밑의 범위가 1 ~ 9 사이었다면 직관적인 코드였겠지만, 그 범위를 넘어섰기 때문에 코드를 다시 짜야했다.

규칙은 그대로 두고, 9를 넘어서서 10의 자리수가 생겨도 1의 자리는 변함없이 앞의 규칙을 따라간다. 그리고, 모든 숫자들은 4번 나오고 나면 다시 원래대로의 숫자로 돌아간다. 그것은 숫자가 4번 나오지 않는 1, 4 등의 경우도 마찬가지이다. 이런 점에서 착안하여, 코드를 많이 줄여서 다시 짜보았다:

#include <stdio.h>

int main(void) {
	int num;
	scanf("%d", &num);
	int a, b;
	for (int i = 0; i < num; i++) {
		scanf("%d %d", &a, &b);
		int remain = b % 4; int result = 1;
		if (remain == 0) remain = 4;
		for (int i = 0; i < remain; i++) {
			result = result * a;
		}
		result = result % 10;
		if (result == 0) result = 10;
		printf("%d\n", result);
	}
	return 0;
}

좋은 웹페이지 즐겨찾기