# 문제
n이 완전수인지 아닌지 판단해주는 프로그램을 작성하라.
# 풀이
크게 어렵지 않은 문제다. 문제에서 요구하는 대로 차근차근 진행해보자.
바로 정답 소스코드 확인!
#include <iostream> #include <vector> using namespace std; int main(){ ios_base::sync_with_stdio(false); // 두 표준 입출력 동기화 해제 cin.tie(NULL); // 입력과 출력 묶음을 풀기 int n = 0; while(1){ cin >> n; if(n == -1) break; vector<int> factor; int perfect = 0; for(int i=1; i<n; i++){ if(n%i == 0){ factor.push_back(i); perfect += i; } } if(perfect == n){ cout << n << " = "; for(int i=0; i < factor.size()-1; i++){ cout << factor[i] << " + "; } cout << factor[factor.size()-1] << '\n'; } else cout << n << " is NOT perfect." << '\n'; } return 0; }
우선 테스트 케이스는 입력으로 -1이 들어올 때까지 끝나지 않으므로 무한루프 while문으로 처리하고 -1이 입력으로 들어올 경우 break를 통해 반복을 중단해주었다.
vector<int> factor; int perfect = 0; for(int i=1; i<n; i++){ if(n%i == 0){ factor.push_back(i); perfect += i; } }
지난 번 2501번 풀이 글과 같이 약수의 개수를 모르기 때문에 동적 크기 조정이 가능한 vector로 약수를 담을 공간을 만들어주었다.
그리고 이번엔 완전수인지 아닌지 체크도 해주어야 하기 때문에 n 자신까지는 체크하지 않도록 for문을 처리했고, 약수를 구함과 동시에 perfect 변수에 더해주었다.
if(perfect == n){ cout << n << " = "; for(int i=0; i < factor.size()-1; i++){ cout << factor[i] << " + "; } cout << factor[factor.size()-1] << '\n'; } else cout << n << " is NOT perfect." << '\n';
만약 위에서 구한 perfect가 n과 같으면 해당 수는 완전수이므로 오름차순으로 문제에서 요구하는 방식대로 출력, 완전수가 아니라면 else문으로 완전수가 아님을 출력해주었다. 끝!
728x90
'백준 > C++' 카테고리의 다른 글
[백준] 2581번: 소수 | C++ 풀이 (0) | 2023.06.10 |
---|---|
[백준] 1978번: 소수 찾기 | C++ 풀이 (0) | 2023.06.09 |
[백준] 2501번: 약수 구하기 | C++ 풀이 (0) | 2023.06.07 |
[백준] 5086번: 배수와 약수 | C++ 풀이 (0) | 2023.06.06 |
[백준] 10757번: 큰 수 A+B | C++ 풀이 (0) | 2023.06.05 |