[C++]GCD 합 - 백준9613

문제



풀이

문제 해석을 하자면,

  • GCD(=최대공약수) 합을 구하는 프로그램

풀이

  • 이전에 구한 방식으로 최대공약수를 구한다.(최대공약수와 최소공배수 게시글 참고)
    • 참고로 풀다가 햇갈렸었는데, 최대공약수 1은 당연히 다들 가지고 있다(여기 조건 범위 안에선)
    • 따라서 calTemp 변수가 곱해지기 위해서 1로 설정한것도 맞지만 최대공약수 1로 초기화 한 의미도 있다는 걸 다시 기억.
  • 모든 쌍을 접근하기 위해 2중 for문으로 접근하겠다.



코드

#pragma warning(disable:4996)
#include <iostream>
#include <string>
using namespace std;

int inputArr[105];

long long calTemp, calResult, maxNum;

int T, N, i, j, k;

void gcd(int, int);

int main() {
	int t = 0;
	cin >> T;
	for (t = 0; t < T; t++) {
		cin >> N;

		// init
		calResult = 0;
		for (i = 0; i < N; i++) {
			inputArr[i] = 0;
		}

		// input
		for (i = 0; i < N; i++) cin >> inputArr[i];

		// GCD
		for (i = 0; i < N-1; i++) {
			for (j = i + 1; j < N; j++) {
				gcd(inputArr[i], inputArr[j]);
			}
		}

		// output
		cout << calResult << '\n';
	}

	return 0;
}

void gcd(int num1, int num2) {
	// run
	calTemp = 1; // 곱하기를 위함이기도 하지만, 최대공약수 1은 무조건 있으니까 이값으로 초기화
	maxNum = max(num1, num2);

	// 1) 동일할 경우(동일할때는 그냥 최대공약수, 최소공배수 전부 동일한 그 수가 답)
	if (num1 == num2) { 
		calResult += num1;
	}
	// 2) 동일한 경우가 아닐땐
	else {
		for (k = 2; k < maxNum; k++) {
			if (num1 % k == 0 && num2 % k == 0) {
				num1 /= k; num2 /= k;
				calTemp *= k;

				// init
				k = 1;  maxNum = max(num1, num2);
			}
		}
		calResult += calTemp;
	}
}



느낀점

생략

댓글남기기