3번 문제
내가 풀이한 답
솔직히 처음에 풀이가 생각나질 않았다. 진약수는 자기 자신을 포함하지 않는 약수들의 집합이기 때문에 위의 출력 예제에서 마지막 10에서 = 으로 가는 방법이 생각나질 않았다. 한참을 고민했고 array를 써볼까도 했지만 이 문제 단계에서는 굳이 안써도 될 것 같다는 생각이 들기도 했고 한참을 더 고민했다. 도저히 생각나질 않아 동영상 풀이를 보았는데 초반부에 "모든 수의 진약수는 앞에 1이 공통적이고 (+ 2) (+ 4) (+ 5) 이런식으로 접근을 해야한다." 라는 얘기를 들었을 때 머리를 한 대 맞은 듯한 느낌이 들었다. 나는 고정관념에 휩싸였는지 무조건 플러스가 뒤에 있는 (1 + ) (2 +) (4 +) 이런식으로만 생각했다. 생각을 바로잡고 코드를 짜보니 답이 금방 나왔다.
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
int n, sum=1;
cin >> n;
cout << sum;
for(int i=2; i<n; i++){
if(n%i==0){
sum += i;
cout << " + " << i;
}
}
cout << " = " << sum << endl;
return 0;
}
1은 모든 수의 약수이므로 sum을 1로 아예 고정시켰다. 그리고 주어진 수 n까지 순회(for)를 돌면서 n을 i로 나누었을 때 나머지가 0인 것을 찾아 sum에 더하고 출력시켜주는 작업을 하였다.
결과는 통과
사이트의 답안
#include <iostream>
using namespace std;
int main(){
int n, sum=1, i;
cin>>n;
cout<<"1";
for(i=2; i<n; i++){
if(n%i==0){
sum+=i;
cout<<" + "<<i;
}
}
cout<<" = "<< sum;
return 0;
}
강의 초반부에서 힌트를 듣고 코드를 짜다보니 사이트의 답안과 매우 비슷하다는 것을 알 수있다. 아니 똑같다. 앞으로 고정관념에서 좀 벗어나는 연습을 좀 해야할 것 같다...
'알고리즘 & 자료구조 > 기초 다잡기' 카테고리의 다른 글
6. 숫자만 추출 (0) | 2020.09.01 |
---|---|
5. 나이 계산 (0) | 2020.09.01 |
4. 나이 차이 (0) | 2020.09.01 |
2. A부터 B까지의 자연수의 합 (0) | 2020.09.01 |
1. 1부터 N까지의 수 중 M의 배수 합 (0) | 2020.08.31 |