๐Ÿ“ Coding Test Study/Algorithm Problem

[C++][BAEKJOON] 9613๋ฒˆ GCDํ•ฉ

ibelieveinme 2022. 4. 2. 01:46
728x90

๋ฌธ์ œ

 

9613๋ฒˆ: GCD ํ•ฉ

์ฒซ์งธ ์ค„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ t (1 ≤ t ≤ 100)์ด ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ํ•œ ์ค„๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ์ˆ˜์˜ ๊ฐœ์ˆ˜ n (1 < n ≤ 100)๊ฐ€ ์ฃผ์–ด์ง€๊ณ , ๋‹ค์Œ์—๋Š” n๊ฐœ์˜ ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„

www.acmicpc.net

 

ํ’€์ด

์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ์ฃผ์–ด์ง„ ์ˆซ์ž์— ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜์— ๋”ฐ๋ผ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ.

 

๊ณ ๋ฏผํ–ˆ๋˜ ๋ถ€๋ถ„์€ 3๊ฐ€์ง€์˜€๋‹ค.

 

1. ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•  ๋‘ ์ˆ˜๋ฅผ ์„ ํƒ(์กฐํ•ฉ์„ ์ด์šฉํ•ด์„œ)ํ•˜๋Š” ๋ฐฉ๋ฒ•

2. ์„ ํƒํ•œ ๋‘ ์ˆ˜๋ฅผ ์ €์žฅ ๋ฐ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜ ์—ฐ์‚ฐ ํ•จ์ˆ˜์— ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•

3. ํ•ญ์ƒ ํฐ์ˆ˜๋ฅผ ์ž‘์€ ์ˆ˜๋กœ ๋‚˜๋ˆ„๊ฒŒ ์ˆซ์ž๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•

 

๋ฌด์‹ํ•˜๊ฒŒ ์ผ๋‹จ ๊ตฌํ˜„ํ•ด๋ณด์ž!๋Š” ๋ง˜์œผ๋กœ ๋ค๋ณ๋”๋‹ˆ ๋ฐ˜๋ณต๋ฌธ๊ณผ ๋ฒกํ„ฐ๋ฅผ ์ข€ ๋งŽ์ด ์ผ๋‹ค... (์ƒ์„ธ ์„ค๋ช…์€ ์ฃผ์„ ์ฐธ์กฐ...)

์ธํ„ฐ๋„ท์„ ์ฐพ์•„๋ณด๋‹ˆ ๋„ˆ๋ฌด๋„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค... ๊ทผ๋ฐ ๋‘ ์ˆ˜๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•์„...ใ…  ๊ทธ๋ฆฌ๊ณ  ์ž‘์€์ˆ˜๋ฅผ ํฐ์ˆ˜๋กœ ๋‚˜๋ˆ ๋„ ๋˜๋Š”๊ตฌ๋‚˜....? ์™œ๊ทธ๋Ÿฐ์ง€.... ์•„์‹œ๋Š” ๋ถ„์€ ๋Œ“๊ธ€ plz ใ…  -> ํ•ด๊ฒฐ์™„๋ฃŒ(๋งจ์•„๋ž˜ ์ฒจ๋ถ€)

 

์ฝ”๋“œ1 (๋งค์šฐ ๋ฌด์‹)

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

void SelectTwoNum(vector<int> num_vector);//์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ์œ„ํ•ด ๋‘ ์ˆ˜๋ฅผ ์„ ํƒํ•˜๋Š” ํ•จ์ˆ˜
int CalculateGCD(int a, int b);//๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•ด์„œ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•  ํ•จ์ˆ˜

//๋‚ด๋ฆผ์ฐจ์ˆœ์„ ์œ„ํ•œ ์กฐ๊ฑด๋ฌธ ํ•จ์ˆ˜
bool lower(int a, int b) {
	return (a > b);
}

int main() {
	int test_case = 0, num_count = 0, num = 0;//ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ˆ˜, ํ•œ ์ค„๋‹น ์ž…๋ ฅ๋ฐ›๋Š” ์ˆ˜, ํ•œ ์ค„์— ์ž…๋ ฅ๋˜๋Š” ์ˆซ์ž๋“ค(๋ฒกํ„ฐ์— ๋„ฃ์œผ๋ ค๊ตฌ)
	vector<int> num_vector;//ํ•œ ์ค„์— ์ž…๋ ฅ๋œ ์ˆซ์ž๋“ค์„ ๋‹ด์€ ๋ฒกํ„ฐ

	cin >> test_case;
	for (int i = 0; i < test_case; i++) {
		cin >> num_count;
		for (int j = 0; j < num_count; j++) {
			cin >> num;
			num_vector.push_back(num);
		}
		if (num_count >= 2) {//ํ•œ ์ค„์— ์ž…๋ ฅ๋œ ์ˆ˜๊ฐ€ 2 ์ด์ƒ์ด๋ฉด ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Ÿฌ ๊ฐ. 1๊ฐœ ์ด๋ฉด ๊ทธ ์ˆ˜๊ฐ€ ๊ณง ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜.
			sort(num_vector.begin(), num_vector.end(), lower);//ํ•ญ์ƒ ํฐ์ˆ˜๋ฅผ ์ž‘์€ ์ˆ˜๋กœ ๋‚˜๋ˆ„๊ฒŒ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•จ. 
			SelectTwoNum(num_vector);//๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•ด์•ผ ํ•ด์„œ 2๊ฐœ์˜ ์ˆซ์ž๋ฅผ ๋ฝ‘์œผ๋Ÿฌ ๊ฐ€์ž.
			num_vector.clear();//์ˆซ์ž๋ฅผ ๋‹ค์‹œ ๋ฐ›์•„์•ผ ํ•˜๋ฏ€๋กœ num_vector ์ดˆ๊ธฐํ™”
		}
		else cout << num_vector.front() << "\n";
	}
	return 0;
}

void SelectTwoNum(vector<int> num_vector) {
	vector<int> check_vector;//0๊ณผ 1์„ ์ด์šฉํ•ด์„œ 2์ˆ˜๋ฅผ ๋ฝ‘๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ ๋ฒกํ„ฐ
	vector<int> selected_num;//์„ ํƒ๋œ ๋‘ ์ˆ˜๋ฅผ ๋‹ด์€ ๋ฒกํ„ฐ
	long long sum = 0;

	for (int i = 0; i < 2; i++) { check_vector.push_back(1); }//1์„ 2๊ฐœ ๋„ฃ์–ด์ฃผ๊ณ (์„ ํƒ๋  ์ธ๋ฑ์Šค ํ‘œ์‹œ)
	for (int i = 0; i < num_vector.size() - 2; i++) { check_vector.push_back(0); }//๋‚˜๋จธ์ง€๋Š” 0์œผ๋กœ.(์„ ํƒ ์•ˆ๋  ์ธ๋ฑ์Šค ํ‘œ์‹œ)
	sort(check_vector.begin(), check_vector.end());//์ž‘์€ ์ˆ˜๋ถ€ํ„ฐ ์ˆœ์—ด์„ ๊ตฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ. ์ค‘๊ฐ„์— ๋น„๋Š” ๊ฒฝ์šฐ ์—†์ด ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด.

	do {
		for (int i = 0; i < num_vector.size(); i++) {
			if (check_vector[i]){//์„ ํƒ๋œ ์ธ๋ฑ์Šค๋ฉด selected_num์— ์ถ”๊ฐ€ํ•ด์คŒ.
				selected_num.push_back(num_vector[i]);
				if (selected_num.size() > 1) {//์„ ํƒ๋œ ์ˆ˜๊ฐ€ 2๊ฐœ๋ฉด ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜ ๊ตฌํ•˜๋Ÿฌ ๋– ๋‚˜๊ธฐ.
					sum += CalculateGCD(selected_num.front(), selected_num.back());//๊ตฌํ•œ ํ•ฉ๋“ค์„ ์ €์žฅ
					selected_num.clear();//์ˆซ์ž๋ฅผ ๋‹ค์‹œ ์„ ํƒํ•ด์•ผ ํ•˜๋ฏ€๋กœ selected_num๋ฒกํ„ฐ clear.
					break;
				}
			}
		}
	} while (next_permutation(check_vector.begin(), check_vector.end()));//๋‹ค์Œ 2์ˆ˜๋ฅผ ๋ฝ‘๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ. ์žˆ์œผ๋ฉด ๋ฐ˜๋ณต๋ฌธ ๊ณ„์† ์ง„ํ–‰.
	cout << sum << "\n";
}

int CalculateGCD(int a, int b) {//์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜
	if (a%b == 0) {
		return b;
	}
	return CalculateGCD(b, a%b);//์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ• GCD(a, b) = GCD(b, a%b)์ž„์„ ์ด์šฉ
}

์ฝ”๋“œ2(์ฐธ๋œ ์ •๋‹ต)

#include <iostream>
#include <vector>
using namespace std;

int CalculateGCD(int a, int b);

int main() {
	int test_case, num_count, num;
	cin >> test_case;

	while (test_case--) {
		vector<int> num_vector;

		cin >> num_count;
		for (int i = 0; i < num_count; i++) {
			cin >> num;
			num_vector.push_back(num);
		}
		long long sum = 0;

		for (int i = 0; i < num_count; i++) {
			for (int j = i+1; j < num_count; j++) {
				sum += CalculateGCD(num_vector[i], num_vector[j]);
			}
		}
		cout << sum << "\n";
		num_vector.clear();
	}
	return 0;
}

int CalculateGCD(int a, int b) {
	if (a%b == 0) {//์™œ ์ž‘์€์ˆ˜๋ฅผ ํฐ์ˆ˜๋กœ ๋‚˜๋ˆ ๋„ ๊ดœ์ฐฎ์€๊ฑธ๊นŒ...
		return b;
	}
	return CalculateGCD(b, a%b);
}

 

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋ฅผ ๋„ˆ๋ฌด ์˜ค๋žœ๋งŒ์— ํ’€์—ˆ๋”๋‹ˆ ๊ฐ์ด ๋‹ค ์ฃฝ์–ด๋”ฐ... ๋‹ค์‹œ ๋Œ์–ด์˜ฌ๋ฆฌ์ž ! I believe in me!


2022.04.02 ์˜คํ›„ ์—…๋ฐ์ดํŠธ

 

๋‘๋ฒˆ์งธ ํ’€์ด์˜ CalculateGCDํ•จ์ˆ˜์—์„œ a%b ๋ฅผ ํ•  ๋•Œ, a>b์˜ ์กฐ๊ฑด์„ ํ™•์ธํ•˜๋Š” ๋ถ€๋ถ„์ด ์—†์–ด์„œ ๋งŒ์•ฝ a<b์˜ ๊ฒฝ์šฐ, ์™œ ์ž‘์€์ˆ˜๋ฅผ ํฐ์ˆ˜๋กœ ๋‚˜๋ˆ ๋„ ๊ดœ์ฐฎ์€๊ฑธ๊นŒ... ๋ผ๋Š” ์ƒ๊ฐ์„ ํ–ˆ์—ˆ๋Š”๋ฐ, ์–ด์ฐจํ”ผ ๋‚˜๋ˆ„์–ด์ง€์ง€ ์•Š๋Š” ๊ฐ’์ด๋ผ ๊ทธ๋Œ€๋กœ a๊ฐ€ ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์ž๋ฆฌ๋ฅผ ๋ฐ”๊ฟ”์„œ ํ•œ๋ฒˆ ๋” ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ๊ดœ์ฐฎ์€๊ฑฐ ์˜€๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, GCD(4, 8)์˜ ๊ฒฝ์šฐ GCD(a,b) == GCD(b, a%b)์ด๋ฏ€๋กœ GCD(8, 4%8)๊ฐ€ ๋ ํ…๋ฐ 4๋Š” 8๋กœ ๋‚˜๋ˆ„์–ด์ง€์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ชซ์ด 0์ด๊ณ  ๋‚˜๋จธ์ง€๊ฐ€ 4๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  GCD(8, 4) ์ด ๊ฐ’์ด ๋‹ค์‹œ ๋‚˜์˜ค๋ฏ€๋กœ GCD(4, 0)์ด ๋˜์–ด ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜ 4๋ฅผ ๋„์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—ˆ๋”ฐ~!!!

 

๊ณตํ•™์ˆ˜ํ•™2๊นŒ์ง€ ํ–ˆ๋Š”๋ฐ, ์ˆ˜ํ•™ ๋‹ค๊นŒ๋จน์—‡์ฃ ~? ํ™”์ด๋ต์ด๋‹คใ…Žใ…Ž...

728x90