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