-
[C++] BOJ 9506번: 약수들의 합프로그래밍/알고리즘 PS 2024. 3. 28. 13:52
학교에서 진행하는 수업에서 같이 듣는 팀원이 공유한 알고리즘 문제를 풀어보았다. 문제의 난이도는 브론즈 1으로, 빠르게 풀 수 있을 거라 생각했지만 출력을 적절하게 하도록 코드를 작성하는 데에 예상보다 시간이 걸렸다.
문제 링크
https://www.acmicpc.net/problem/9506
문제 분석
해당 문제는 완전수를 찾는 문제이다. 완전수란 자기 자신을 제외한 모든 약수를 더했을 때 자기 자신과 같은 값이 나오는 수를 의미한다. n이 완전수가 아님이 판별되면
n is NOT perfect.를 출력한다. n이 완전수일 경우 n을 약수들의 합으로 표현해야 하는데, 이 부분에서 코드가 길어졌다.문제 풀이
먼저 주어진 숫자 n의 약수를 구하는 법을 판단해보자. 어떤 수 k가 있을 때,
n % k == 0이라면 k는 n의 약수이다.이에 따라 n 자기 자신을 제외한 n의 모든 약수를 처리하는 코드는 다음과 같아진다.
for(int i=1; i<n; i++) if(n % i == 0) // i는 n의 약수일 경우위의 if문 내에서 약수
i를 처리하면 된다.n이 완전수일 경우 출력이
6 = 1 + 2 + 3과 같은 형태로 출력되어야 하므로 n의 약수를 담아둘 배열이 필요하다. 따라서 아래와 같이 배열을 선언한다.int factors[100000] = { 0, }; int factor_size = 0;배열
factors의 크기가 100000인 이유는 문제에서 n의 최대값이 100000이 될 수 없다고 나와 있기 때문이다.factor_size는factors배열에 담긴 약수의 갯수를 저장하는 변수이다.int sum = 0; for (int i = 1; i < n; i++) { if (n % i == 0) { sum += i; factors[factor_size++] = i; } }위 코드는 해당 수가 완전수인지 비교하기 위해 약수의 값을 모두 더하고, 약수들을
factors배열에 저장해두는 코드이다. 만약 계산 결과sum == n이면 완전수에 해당하며,sum != n이면 n이 완전수가 아니다.먼저
sum != n인 경우 아래와 같은 코드로 결과를 출력한다.cout << n << " is NOT perfect." << '\n';그리고
sum == n인 경우factors배열에 저장한 약수들을 이용해 결과를 출력한다.cout << n << " = "; for (int i = 0; i < factor_size; i++) { cout << factors[i]; if (i != factor_size - 1) cout << " + "; } cout << '\n';전체 코드
위의 코드를 종합해 작성한 전체 코드는 다음과 같다.
#include <iostream> #include <vector> using namespace std; void solution(int n) { int sum = 0; int factors[100000] = { 0, }; int factor_size = 0; for (int i = 1; i < n; i++) { if (n % i == 0) { sum += i; factors[factor_size++] = i; } } if (sum == n) { cout << n << " = "; for (int i = 0; i < factor_size; i++) { cout << factors[i]; if (i != factor_size - 1) cout << " + "; } cout << '\n'; } else { cout << n << " is NOT perfect." << '\n'; } } int main(void) { ios::sync_with_stdio(false); cin.tie(nullptr); int n; while (true) { cin >> n; if (n == -1) break; solution(n); } return 0; }결과

'프로그래밍 > 알고리즘 PS' 카테고리의 다른 글
[C++] BOJ 1032번: 명령 프롬프트 (0) 2024.03.28 [C++] BOJ 1748번: 수 이어 쓰기 1 (0) 2024.03.28 [C++] BOJ 1629번: 곱셈 (0) 2024.03.28 [C++] BOJ 1699번: 제곱수의 합 (0) 2020.12.08 [C++] BOJ 2579번: 계단 오르기 (0) 2020.12.08