[백준 BOJ] 9506번 약수들의 합 (C++/cpp)

2022. 6. 8. 01:30PS (Program Solving)/BOJ (백준)

문제 설명

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

 

9506번: 약수들의 합

어떤 숫자 n이 자신을 제외한 모든 약수들의 합과 같으면, 그 수를 완전수라고 한다.  예를 들어 6은 6 = 1 + 2 + 3 으로 완전수이다. n이 완전수인지 아닌지 판단해주는 프로그램을 작성하라.

www.acmicpc.net

백준 BOJ 9506번 약수들의 합 문제 사진

 

접근 방법 - 약수 연산의 응용문제

백준의 9506번 문제는 약수에 관한 연산을 기본적으로 응용해야 하는 문제이다.

해당 문제는, 입력값에 대한 약수들에 대하여 이 숫자가 완전수인지 아닌지에 따라 특정 문장을 출력해야 하는 문제이다.

여기서 완전수란, 특정 숫자와 이에 관한 약수들의 합이 동일한 숫자를 뜻한다.

이 용어의 뜻만 어느 정도 이해했다면 어렵지 않게 풀 수 있는 문제로 예상된다.

다만 필자는, 출력 양식을 보면서 이 문제에선 약수들의 합 뿐만 아니라 약수의 개수 또한 함께 구해야 한다고 판단하였다.

만일 출력 양식대로 출력문을 작성하는 데에 어려움을 겪고 있다면, 이 점을 참고해보길 바란다.

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

 

코드의 실행 순서

1) 무한 반복문을 실행하여 연산을 수행하도록 한다.

 

- 값(a)을 입력받고, 약수들을 저장할 배열(arr)을 0으로 초기화하여 선언한다.

(만일 여기서 -1을 입력받았다면, 무한 반복문에서 탈출하도록 한다.)

 

- 약수들의 합을 저장할 변수 sum을 0으로 초기화하여 선언한다. 또한, 약수들의 개수를 저장할 변수 index를 0으로 초기화하여 선언한다.

(index 변수는 출력 양식대로 문장을 작성하는 데에 사용되기 때문에 추가적으로 선언하도록 한다.)

- 다른 반복문 for문을 통해 약수의 종류를 탐색하도록 한다.

for문에 따른 현재 탐색값인 i가 약수로 판별되면, sum에 i의 값을 더한다. 그리고 arr에 i의 값을 저장하도록 한다.

(arr에 i를 저장할 시, index의 값을 적절히 조절해가면서 저장을 수행하도록 한다.)

 

- 약수들의 합 연산이 모두 끝났다면, 해당 숫자가 완전수인지를 판별한다.

완전수가 아닌 경우와 완전수인 경우를 잘 판별하여, 각 출력 양식을 지키면서 출력하도록 한다.

 

2) 1)의 무한 반복문이 모두 실행되었다면, 실행 종료한다.

반응형

 

성공한 코드

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#define endl '\n'
using namespace std;

//백준 9506번 코드
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);	cout.tie(NULL);

	while (1) {
		int a;	int arr[100000] = { 0 };
		cin >> a;
		if (a == -1) { break; }

		int sum = 0;
		int index = 0;
		for (int i = 1; i < a; i++) {
			if (a % i == 0) { 
				sum += i;
				arr[index] = i;	index++;
			}
		}

		if (sum != a) {
			cout << a << " is NOT perfect." << endl;
			continue;
		}
		cout << a << " = ";
		for (int i = 0; i < index; i++) {
			if (i != index - 1) {
				cout << arr[i] << " + ";
			}
			else {
				cout << arr[i] << endl;
			}
		}
	}
}

 

제출 결과

백준 BOJ 9506번 약수들의 합 문제 C++ 제출 결과

(2022.05.07 백준 9506번 문제 제출 결과)

반응형