본문 바로가기

CodingTest Exam/[C++] Algorithm Study

9. 모두의 약수 (it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비) ★★☆☆☆

#include<stdio.h>

int count[50001]; // 전역 변수 선언 
int main(){
	// main 함수 내에 count[]를 선언하면
	// 초기값이 0이 아니라 쓰레기 값으로 초기화된다. 
	int a;
	scanf("%d", &a);
	
	for(int i = 1; i <= a; i++)
	{
		for(int j = i; j <= a; j=j+i)
			if(j % i == 0)
				count[j]++;
		
		printf("%d ", count[i]);
	}
	return 0;
}

1. 전역 변수 선언 : main() 함수 바깥에 선언한 이유는 main() 함수 내에 빈 배열을 선언할 경우 0으로 초기화 되는 것이 아니라 의미없는 쓰레기 값으로 초기화가 된다. 따라서 0으로 초기화 시키기 위해서 main() 함수 외부에 선언했다.

2. 시간 절약 : 처음 이 문제를 구상했을 때는 같은 중첩 for 문이지만 j가 매번 1부터 i까지 돌면서 약수를 찾아 count++ 해줬다. 이는 n^2 만큼의 시간복잡도를 가지기 때문에 시간제한 1초 이내에 해결할 수 없다.

ex) a가 30000 일 때, i가 30000이 되어 loop를 돌 때 j는 1부터 30000까지 돌아야한다.