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

    2번 문제    

.    1번 문제      

    1번

 

    내가 풀이한 답    제   1 문제   

    내가 풀이한 답   

#include <iostream>
using namespace std;

int main(int argc, char** argv) {
	int a, b, sum=0;
	cin >> a >> b;
	
	for(int i=a; i<=b; i++){
		sum += i;
		if(i==b){
			cout << i << " = ";
		}
		else {
			cout << i << " + ";
		}
	}	
	cout << sum << endl;
	return 0;
}

 

 문제를 보자마자 떠오른 생각은 string 변수를 하나 두어 변수에 값들을 추가하는 방식으로 생각을 했다. 하지만, 굳이 string 변수를 쓰지 않아도 cout 객체만으로도 출력할 수 있음을 깨달았다. 출력 예제를보면  마지막에만 "=" 이고 나머지는 "+" 인 것을 확인하고 순회를 돌면서 마지막 숫자인 b에 해당하는 부분에 분기문(if)으로 처리를 하였다. 

 

 결과는 통과를 하였다.

 

 

 

 

    사이트의 답안   

 

#include<stdio.h>
int main(){
	int a, b, sum=0, i;
	scanf("%d %d", &a, &b);
	for(i=a; i<b; i++){
		sum+=i;
		printf("%d + ", i);
	}
	printf("%d = %d\n", i, sum+i);
	return 0;
}

 

 여기서는 C 언어로 작성되었다. 굳이 분기문(if)문을 안쓰고 짤 수 있다는 것을 확인했다. +에 해당하는 부분에만 순회를 돌고 마지막은 그냥 따로 빼서 출력을 한 모습... 이렇게 더 간단하게 짤 수 있다는 것을 느꼈다.

'알고리즘 & 자료구조 > 기초 다잡기' 카테고리의 다른 글

6. 숫자만 추출  (0) 2020.09.01
5. 나이 계산  (0) 2020.09.01
4. 나이 차이  (0) 2020.09.01
3. 진약수의 합  (0) 2020.09.01
1. 1부터 N까지의 수 중 M의 배수 합  (0) 2020.08.31

    1번 문제   

 

 

    내가 풀이한 답   

#include <iostream>
using namespace std;

int main(int argc, char** argv) {
	int n, m, sum = 0;
	cin >> n >> m;
	int temp = m;
	
	for(int i=0; i<n/m; i++) {
		sum += temp;
		temp = temp + m;
	}
	
	cout << sum << endl;
	
	return 0;
}

 

 처음에는 자연수 N의 개수만큼 순회(for)를 돌고 조건문(if)을 사용해 M으로 나누어서 0이되는 숫자를 찾아 Sum 변수에 더해줄 생각을 하였지만 너무 불필요하게 순회를 돈다고 생각했다.

 

 하지만, 어차피 배수만 더해주면 되는 조건이라고 생각을 해서 N을 M으로 나눈 개수만큼만 돌고 순회를 도는 동안 m을 계속 더한 값을 저장해주는 temp 변수를 설정해서 sum 변수에 더하는 것을 생각해보았다. 

 

 결과는 통과

 

 

    사이트의 답안   

#include <iostream>
using namespace std;
int main(int argc, char** argv) {
	int n, m, sum = 0;
	cin >> c >> n >> m;
    
	for (int i=1; i<=n; i++) {
		if(i%m==0) {
			sum=sum+i;
		}
	}
    
	cout << sum << endl;
    
	return 0;
}

 

 처음에 생각했던 것과 똑같은 답이였다. 오늘은 쉬운 문제를 풀어봤는데 C++이 좀 오랜만이기도 해서 낯설었다. Time Limit이 1초 이내라는데 지금 단계에서는 체감이 느껴지지 않는다. 실행 시간 체크와 메모리 누수 체크는 기초 다지기 이후로 알고리즘을 어느정도 복습한 뒤에 해야겠다...

'알고리즘 & 자료구조 > 기초 다잡기' 카테고리의 다른 글

6. 숫자만 추출  (0) 2020.09.01
5. 나이 계산  (0) 2020.09.01
4. 나이 차이  (0) 2020.09.01
3. 진약수의 합  (0) 2020.09.01
2. A부터 B까지의 자연수의 합  (0) 2020.09.01