2022. 11. 22. 17:31ㆍPS (Program Solving)/BOJ (백준)
문제 설명
https://www.acmicpc.net/problem/14563
14563번: 완전수
어떠한 자연수 N에 대해서 N을 제외한 약수(진약수)의 합이 N이 되는 자연수를 완전수라고 한다. 예를 들어, 6의 약수는 1, 2, 3, 6인데 1+2+3은 6이기 때문에 완전수이다. 또 진약수의 합이 자기 자신
www.acmicpc.net
접근 방법 - 약수 연산의 기본 문제
백준의 14563번 문제는 약수 연산을 통해 간단하게 해결할 수 있는 문제이다.
해당 문제는, 입력값에 대해 자기 자신을 제외한 약수들의 합을 이용하여 알맞은 정답을 출력해야 하는 문제이다.
이때, 이러한 약수들의 합에 따라 아래처럼 판별하여 출력을 수행해야 한다.
(ex) 입력값 n, n에 대한 자기 자신을 제외한 약수들의 합 sum
- sum이 n과 같은 경우는, 완전수(Perfect)
- sum이 n보다 작은 경우는, 부족수(Deficient)
- sum이 n보다 큰 경우는, 과잉수(Abundant)
반복문의 사용과 약수 연산을 능숙하게 할 수 있다면 비교적 쉽게 해결할 수 있을 것이라 예상된다.
혹여나 해당 문제를 해결하는 데에 어려움을 겪고 있다면, 아래의 설명과 코드를 참고해보길 바란다.
필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.
코드의 실행 순서
1) 테스트 케이스의 수(n)를 입력받는다.
2) n의 크기에 따라 반복문을 실행하면서, 아래의 연산을 수행한다.
- 값(a)을 입력받는다.
- a에 대하여, a 자기 자신을 제외한 약수들의 합을 저장할 변수 sum을 0으로 초기화하여 선언한다.
- 1부터 a 이전까지 하여, a의 약수들을 sum에 순차적으로 더하도록 한다. (나머지 연산자를 활용해서 구한다.)
- sum의 값에 따라, Perfect / Deficient / Abundant 중 하나를 알맞게 출력하도록 한다.
3) 결괏값이 모두 출력되었다면, 실행 종료한다.
성공한 코드
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#define endl '\n'
using namespace std;
//백준 14563번 코드
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int n;
cin >> n;
for (int i = 0; i < n; i++) {
int a;
cin >> a;
int sum = 0;
for (int j = 1; j < a; j++) {
if (a % j == 0) { sum += j; }
}
if (sum == a) { cout << "Perfect" << endl; }
else if (sum < a) { cout << "Deficient" << endl; }
else { cout << "Abundant" << endl; }
}
}
제출 결과
(2022.05.26 백준 14563번 문제 제출 결과)
'PS (Program Solving) > BOJ (백준)' 카테고리의 다른 글
[백준 BOJ] 11656번 접미사 배열 (C++/cpp) (0) | 2022.11.24 |
---|---|
[백준 BOJ] 15886번 내 선물을 받아줘 2 (C++/cpp) (0) | 2022.11.24 |
[백준 BOJ] 2857번 FBI (C++/cpp) (0) | 2022.11.22 |
[백준 BOJ] 11365번 !밀비 급일 (C++/cpp) (0) | 2022.11.21 |
[백준 BOJ] 9656번 돌 게임 2 (C++/cpp) (0) | 2022.11.21 |