PS (C, C++)

[백준/C & C++] 1037 약수

최연재 2022. 8. 26. 01:43

https://www.acmicpc.net/problem/1037

 

1037번: 약수

첫째 줄에 N의 진짜 약수의 개수가 주어진다. 이 개수는 50보다 작거나 같은 자연수이다. 둘째 줄에는 N의 진짜 약수가 주어진다. 1,000,000보다 작거나 같고, 2보다 크거나 같은 자연수이고, 중복되

www.acmicpc.net

코드 (C)

#include <stdio.h>
#include <stdlib.h>

void swap(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

int main()
{
	int n, result;
	scanf("%d", &n);
	int* ptr = (int*)malloc(n * sizeof(int));
	for (int i = 0; i < n; i++) scanf("%d", &ptr[i]);

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n - 1; j++)
		{
			if (ptr[j] > ptr[j + 1])
				swap(&ptr[j], &ptr[j + 1]);
		}
	}

	if (n % 2 == 0) result = ptr[0] * ptr[n - 1];
	else result = ptr[n / 2] * ptr[n / 2];

	printf("%d", result);
	free(ptr);
	return 0;
}

코드 (C++)

#include <iostream>
using namespace std;

void swap(int* a, int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

int main()
{
	int number,result;
	cin >> number;
	int* ptr = new int[number];

	for (int i = 0; i < number; i++) cin >> ptr[i];

	for (int i = 0; i < number; i++)
	{
		for (int j = 0; j < number - 1; j++) if (ptr[j] > ptr[j + 1]) swap(&ptr[j], &ptr[j + 1]);

	}

	if (number % 2 == 0) result = ptr[0] * ptr[number - 1];
	else result = ptr[number / 2] * ptr[number / 2];

	cout << result;

	delete[] ptr;
	return 0;
}

코드 설명

입력받은 약수의 개수를 이용해 약수를 저장할 동적배열을 생성한다. 

반복문을 돌면서 약수를 입력받고, 그 후 버블정렬로 배열을 정렬한다. 

만약 약수의 개수가 짝수라면 정렬된 배열의 양끝 값을 곱한 값이 결과가 된다. 

만약 약수의 개수가 홀수라면 가운데에 있는 값을 제곱한 값이 결과가 된다. 

경우에 따라 계산된 결과를 출력하고 동적배열을 해제한다. 

 

느낀 점

문제를 복잡하게 푼 것 같다. 버블정렬로 약수들을 점점 커지는 순으로 배열한 후 약수들이 짝수인 경우와 홀수인 경우를 나눠 풀었는데, 굳이 그럴 필요가 없었다. 그냥 반복문을 돌면서 최솟값과 최댓값을 구하고 그 둘을 곱해주면 더욱 짧게 코드를 작성할 수 있었을 것이다.