오늘은 단계별로 풀어보기 약수, 배수와 소수 파트에 있는 9506번 약수들의 합을 풀어보았다.시험기간이라 다름 브론즈 문제들로 꾸준히 풀려고 노력해야겠다.
문제는 만약 약수면 약수의 합을 출력하고, 약수가 아니면 NOT perfect 출력, -1이면 프로그램을 종료하는 프로그램을 작성하는 문제이다.
코드는 아래와 같다. 코드를 부분저긍로 분석을 해보겠다.
#include <iostream>
using namespace std;
int n, sum, arr[100000], idx=0;
int main() {
while(1)
{
cin >> n;
if (n == -1) break;
for (int i = 1; i < n; i++)
{
if (n % i == 0){
arr[idx++] = i;
sum += i;
}
}
if (sum != n){
cout << n << " is NOT perfect." << '\n';
}
else if (sum == n){
cout << n << " = ";
for (int i = 0; i < idx - 1; i++)
{
cout << arr[i] << " + ";
arr[i] = 0;
}
cout << arr[idx - 1] << '\n';
arr[idx-1] = 0;
}
idx = 0;
sum = 0;
}
}
먼저 약수들을 차례데로 출력을 해야하므로 바로 배열이 떠올랐다. 그리고 이와 같이 시작을 하였다.
또한 -1이 들어오는 순간 코드 실행이 멈추므로 while 문을 사용하여 숫자 -1이 들어오면 바로 실행을 끝내도록 하였고. 약수를 구하고, 배열에 저장하기 위해, for문을 사용하였다.
또한 약수는 입력된 숫자와 같으면 안되므로 for(int i=1; i <n; i++) 로 해주었다.
이어서 조건에 맞게 출력하는 프로그램이다. 만약 약수의 합이 입력된 숫자와 값이 같지 않다면, 약수가 아니므로 is NOT perfect 를 출력해준다.
그리고 만약에 약수가 맞다면, 배열 인덱스에 저장된 순서대로 출력을 해준다. for (int i = 0; i < idx - 1; i++) 그리고 또한
while 문안에서 -1이 들어오기 전까지 프로그램이 계속 돌아가므로 초기화를 계속 해주기 위해서, idx=0. sum=0 을 해준다.
처음에는 문제가 쉬워보였지만, 내가 생각하지 못한 부분이 있어서 새로 배워가는 시간이었다.