본문 바로가기

CodingTest Exam/[C++] Algorithm Study

52. Ugly Numbers (it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비) ★★★★☆

#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
	int n, min = 2147000000, p2, p3, p5;
	scanf("%d", &n);
	
	vector<int> a(1501, 0);
	vector<int> b;
	a[1] = 1;
	p2 = 1;
	p3 = 1;
	p5 = 1;
	for(int i = 2; i <= n; i++)
	{
		b.push_back(a[p2] * 2);
		b.push_back(a[p3] * 3);
		b.push_back(a[p5] * 5);
		
		a[i] = *min_element(b.begin(), b.end());
		
		if(a[i] == b[0])
			p2++;
			
		if(a[i] == b[1])
			p3++;
			
		if(a[i] == b[2])
			p5++;
			
		b.clear();
	}
	
	printf("%d", a[n]);
	return 0;
}

1. 포인터 3개 p2, p3, p5 로 소인수로만 이루어진 vector를 만들고 그 vector의 n번째 요소를 출력하는 코드이다.

 

vector a의 idx가 1부터 10까지를 나타낸 것이다.

1 2 3 4 5 6 7 8 9 10
1                  

문제에서 1은 Ugly Number의 첫 번째라는 조건이 있기 때문에 a[1] = 1 이다.

p2, p3, p5를 모두 1로 초기화해준다.(곱의 항등원) 

p2 포인터가 가리키는 수에는 2를, p3 포인터가 가리키는 수에는 3을, p5 포인터가 가리키는 수에는 5을 곱한다.

곱한 수를 vector b에 추가한다.

<algorithm> 라이브러리의 *min_element() 를 이용하여 vector b의 최솟값을 추출하여 a[i]에 대입한다.

a[p2] * 2 = 2

a[p3] * 3 = 3

a[p5] * 5 = 5

vector b = [2, 3, 5]

a[i] = a[2] = 2;

 

최솟값이 된 포인터에 1을 더해준다.

p2++;

 

위 과정을 거치면 아래와 같다.

1 2 3 4 5 6 7 8 9 10
1 2                

 

a[p2] * 2 =  2* 2 = 4

a[p3] * 3 = 3

a[p5] * 5 = 5

 

a[3] = 3

p3++;

1 2 3 4 5 6 7 8 9 10
1 2 3              

 

a[p2] * 2 =  2 * 2 = 4

a[p3] * 3 = 2 * 3 = 6

a[p5] * 5 = 5

 

a[4] = 4

p2++;

1 2 3 4 5 6 7 8 9 10
1 2 3 4            

 

a[p2] * 2 =  3 * 2 = 6

a[p3] * 3 = 2 * 3 = 6

a[p5] * 5 = 5

 

a[5] = 5

p2++;

1 2 3 4 5 6 7 8 9 10
1 2 3 4 5          

 

a[p2] * 2 =  3 * 2 = 6

a[p3] * 3 = 2 * 3 = 6

a[p5] * 5 = 2 * 5 = 10

 

a[6] = 6

p2++;

p3++;

1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6        

이후 반복