[백준 BOJ] 2028번 자기복제수 (C언어)

2022. 1. 13. 16:47PS (Program Solving)/BOJ (백준)

문제 설명

https://www.acmicpc.net/problem/2028

 

2028번: 자기복제수

어떤 자연수 N을 제곱했을 때, 그 제곱수의 맨 뒷자리에 원래의 수 N이 다시 나타나면, 우리는 그 수 N을 자기복제수라고 한다. 예를 들면, 5의 제곱은 52는 25이고 25의 맨 뒷자리에 원래의 수 5가

www.acmicpc.net

백준 BOJ 2028번 자기복제수 문제 사진

 

접근 방법 - 단순 수학적 사고력을 요구하는 문제

백준 2028번 문제는 간단한 수학적 사고력을 요구하는 문제인 것으로 확인된다.

필자의 경우엔, 문제에 기술되어있는 입력되는 수 n의 범위를 참고하며 3가지의 경우로 나누어보았다.

 

- n이 100 이상이면 n은 3 자릿수이다. 따라서 n^2에 1000으로 나머지 연산자 취하여 뒤의 세 자릿수만 떼어놓는다.

- n이 10 이상이면 n은 2 자릿수이다. 따라서 n^2에 100으로 나머지 연산자 취하여 뒤의 두 자릿수만 떼어놓는다.

- n이 1 이상이면 n은 1 자릿수이다. 따라서 n^2에 10으로 나머지 연산자 취하여 뒤의 한 자릿수만 떼어놓는다.

=> 각 경우의 수에서 떼어놓은 숫자가 n과 같을 시 "YES"를 출력, 다를 시 "NO"를 출력한다.

(n의 범위에서 1000도 포함되어있지만, 1000는 수기로 연산했을 시 자기복제수가 아니기 때문에 처음부터 배제시켰다.)

 

필자는 위를 이용해서 아래의 순서대로 코드를 작성하여 문제를 해결하였다.

 

코드의 실행 순서

1) 테스트 케이스의 수를 입력받은 뒤, n을 하나씩 입력받는다.

 

2) n의 범위에 따라 정답을 결정하도록, 조건문을 작성하여 각 정답을 출력한다.

n의 자릿수가 3인 경우(100 ~ 999) / n의 자릿수가 2인 경우(10 ~ 99) / n의 자릿수가 1인 경우(1 ~ 9)

(조건문의 상세 내용은 위 설명 참고)

 

3) 모든 테스트 케이스가 실행되었을 시 실행 종료한다.

반응형

 

성공한 코드

#include <stdio.h>
#define _CRT_SECURE_NO_WARNIGS

//백준 2028번 코드
int a[30];
int main() {
	int n;
	scanf("%d", &n);

	for (int i = 0; i < n; i++) {
		scanf("%d", &a[i]);
	}

	for (int i = 0; i < n; i++) {
		if (a[i] > 99 && (a[i]*a[i])%1000==a[i]) {
			printf("YES\n");
			continue;
		}
		else if (a[i] > 9 && (a[i] * a[i]) % 100 == a[i]) {
			printf("YES\n");
			continue;
		}
		else if (a[i] > 0 && (a[i] * a[i]) % 10 == a[i]) {
			printf("YES\n");
			continue;
		}
		else {
			printf("NO\n");
			continue;
		}
	}

	return 0;
}

 

제출 결과

백준 BOJ 2028번 자기복제수 문제 C 제출 결과

(2021.09.05 백준 2028번 제출 결과)

(컴파일 에러는 scanf랑 scanf_s 작성 바꾸는 거 매번 까먹어서)

반응형