ํ”„๋กœ๊ทธ๋ž˜๋ฐ/Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜ ๊ตฌํ•˜๊ธฐ - ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ• Euclidean Algorithm

NaNaRin๐Ÿ™ƒ 2021. 1. 23. 15:16

 

์ผ๋ฐ˜์ ์œผ๋กœ A์™€ B์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€

A์™€ B๋ฅผ 2๋ถ€ํ„ฐ A์™€ B์ค‘ ๋” ์ž‘์€ ์ˆ˜ ๊นŒ์ง€ ๋ชจ๋“  ์ž์—ฐ์ˆ˜๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด๋‹ค.

์ด ๋ฐฉ๋ฒ•์€ ์ˆ˜๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ ค ๋น„ํšจ์œจ์ ์ด๋ฉฐ, ๋ชจ๋“  ์ˆ˜๋กœ ๋‚˜๋ˆ ์•ผ ํ•˜๋ฏ€๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n)์ด ๋œ๋‹ค.

์ด๋•Œ ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ• (Euclidean Algorithm) :

๋‘ ์ •์ˆ˜์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜(Greatest Common Divisor)๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

A > B ์ผ ๋•Œ1. A % B = C2. B % C = D3. ์œ„ ๊ณผ์ •์„ ๊ณ„์† ๋ฐ˜๋ณต4. X % Y = 0, Y๊ฐ€ A์™€ B์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜

 

๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•ด ๋ณด์ž

๋‘ ์ •์ˆ˜ A, B๋ฅผ ์ง์‚ฌ๊ฐํ˜•์˜ ๋‘ ๋ณ€์˜ ๊ธธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ง์‚ฌ๊ฐํ˜•์„ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ์™„์ „ํžˆ ์ฑ„์šฐ๋ ค๊ณ  ํ•  ๋•Œ ์ •์‚ฌ๊ฐํ˜•์˜ ๊ฐ€์žฅ ๊ธด ๋ณ€์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค

   1. ์งง์€ ๋ณ€์˜ ๊ธธ์ด๋ฅผ ํ•œ ๋ณ€์œผ๋กœ ํ•˜๋Š” ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ์ฑ„์šด๋‹ค

   2. ๋‚จ์€ ์ง์‚ฌ๊ฐํ˜•์— ๋Œ€ํ•ด ๋ฐ˜๋ณต

 

์˜ˆ๋ฅผ๋“ค์–ด 22์™€ 8์˜ ์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜๋ฅผ ๊ตฌํ•  ๋•Œ

22 = 8 + 8 + 6  /  8 = 6 + 2  /  6 = 2 + 2 + 2  => 22์™€ 8์˜ ์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜๋Š” 2

 

22์™€ 8์˜ ์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๊ณผ์ •

 

 

๋ฉ”์„œ๋“œ gcd() : ์ž์—ฐ์ˆ˜ a์™€ b ๋‘ ์ˆ˜์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜ ์ฐพ๊ธฐ

๋งค๊ฐœ๋ณ€์ˆ˜ : int a, int b

๋ฐ˜ํ™˜๊ฐ’ : a์™€ b์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜ ๋ฐ˜ํ™˜

 

- ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๊ตฌํ˜„ํ•œ ๊ฒฝ์šฐ

int gcd(int a, int b) {
	if (b == 0) {
		return a;
	} else {
    	int c = a % b;
		return gcd(b, c);
	}
}

 

- ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ตฌํ˜„ํ•œ ๊ฒฝ์šฐ

int gcd(int a, int b) {
	while (b != 0) {
		int c = a;
		a = b;
		b = c % b;
	}
	return a;
}

 

 

 

 

์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ• Euclidean Algorithm : O(logN)