๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ’ป Computer Science/- Data Structure, Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์œ ํด๋ฆฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•œ ์ตœ์†Œ ๊ณต๋ฐฐ์ˆ˜์™€ ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜ ๊ตฌํ•˜๊ธฐ

by Wonit 2021. 2. 4.

์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ• (์•Œ๊ณ ๋ฆฌ์ฆ˜)์€ ์„ธ๊ณ„ ์ตœ์ดˆ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

 

์ด ์„ธ๊ณ„ ์ตœ์ดˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์–ด๋–ค ๋™์ž‘์„ ํ•˜๊ณ  ์–ด๋–ค ๊ฒฐ๊ณผ๋ฅผ ๋‚ด๋Š”์ง€ ์•Œ์•„๋ณด์ž.

์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šธ ๊ฒƒ

  • ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•
    • ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜
    • ์ตœ์†Œ ๊ณต๋ฐฐ์ˆ˜
  • Java๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ
    • ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜
      • ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•œ ๊ตฌํ˜„
      • ์žฌ๊ท€ํ˜ธ์ถœ์„ ํ†ตํ•œ ๊ตฌํ˜„
    • ์ตœ์†Œ ๊ณต๋ฐฐ์ˆ˜
  • ์‹œ๊ฐ„๋ณต์žก๋„

์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•

์œ ํด๋ฆฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ 2๊ฐœ์˜ ์ž์—ฐ์ˆ˜์˜ ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜๋ž€ ๋ฌด์—‡์ธ์ง€ ๊ธฐ์–ต์ด ๋‚˜๋ฉด ์ข‹๊ฒ ์ง€๋งŒ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋Š” ์ค‘ํ•™๊ต 1ํ•™๋…„ ๊ต์œก ๊ณผ์ •์— ๋‚˜์˜ค๋Š” ๋‚ด์šฉ์ด๋ผ ๊นŒ๋จน์—ˆ์„ ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ๋‹ค์‹œ ํ•œ๋ฒˆ ์ƒ๊ธฐ์‹œ์ผœ์ฃผ์ž๋ฉด

์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜์™€ ์ตœ์†Œ ๊ณต๋ฐฐ์ˆ˜

์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜์™€ ์ตœ์†Œ ๊ณต๋ฐฐ์ˆ˜๋ฅผ ๊ฐ€์žฅ ๋นจ๋ฆฌ ์ƒ๊ธฐ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์€ ์šฐ๋ฆฌ๊ฐ€ ์ฃฝ์–ด๋ผ ํ–ˆ๋˜ ๊ณต์‹์„ ํ•œ ๋ฒˆ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ๋‹ค.

 

์ตœ๋Œ€๊ณต์•ฝ์ˆ˜(GCD) ๋Š” ์–ด๋–ค ๋‘ ์ˆ˜ A, B๊ฐ€ ์กด์žฌํ•  ๋•Œ, ๊ณตํ†ต์ธ ์•ฝ์ˆ˜ ์ค‘ ๊ฐ€์žฅ ํฐ ์ˆ˜

์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜(LCM) ๋Š” ์–ด๋–ค ๋‘ ์ˆ˜ A, B๊ฐ€ ์กด์žฌํ•  ๋•Œ, ๊ทธ๋“ค์˜ ๋ฐฐ์ˆ˜๊ฐ€๋˜๋Š” ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜

 

๋ณดํ†ต ์šฐ๋ฆฌ๋Š” ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜๋ฅผ ๊ตฌํ• ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ•˜๊ฒŒ ๋œ๋‹ค.

์ถœ์ฒ˜ : http://yoonbumtae.com/?p=2302

์ด์ œ ๋‹ค์‹œ ๋ณธ๋ก ์œผ๋กœ ๋Œ์•„๊ฐ€์„œ ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์ด ๋ฌด์—‡์ด๋ƒ?


์œ„์—์„œ ๋ณธ ์‚ฌ์ง„์ฒ˜๋Ÿผ GCD์ด๋‚˜ LCM์„ ๊ตฌํ•˜๊ฒŒ ๋˜๋ฉด ๋งŒ์•ฝ A, B๊ฐ€ ๋ง๋„ ์•ˆ๋˜๊ฒŒ ํฐ ์ˆ˜๋ผ๋ฉด ์•„์ฃผ ํž˜๋“ค์–ด์ง„๋‹ค.


ํ•˜์ง€๋งŒ ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์„ ์ด์šฉํ•œ๋‹ค๋ฉด ์‰ฝ๊ณ  ์ฒด๊ณ„์ ์œผ๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์œผ๋กœ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜ ๊ตฌํ•˜๊ธฐ

์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์˜ ํ•ต์‹ฌ์€ ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์ด๋‹ค.


๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์„ ๋ฐ˜๋ณตํ•˜์—ฌ 0์ด๋  ๋•Œ ๊นŒ์ง€ ๊ฐ„๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋งŒ์•ฝ ์ˆ˜ A์™€ B๊ฐ€ ์žˆ๊ณ  ํ•ด๋‹น ์ˆ˜์˜ ๋‚˜๋จธ์ง€, ๋ชจ๋“ˆ๋Ÿฌ N์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

์ด ๋‘˜์„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด ๋œ๋‹ค.

  1. A์™€ B์ค‘ ๋” ํฐ ์ˆ˜ ์ฐพ๊ธฐ.
  2. ํฐ ์ˆ˜๋ฅผ A๋กœ ์ž‘์€ ์ˆ˜๋ฅผ B๋กœ ์„ค์ •
  3. A % B = N ๊ตฌํ•˜๊ธฐ
  4. N == 0 ์ด๋ฉด B๋Š” ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜
  5. N != 0 ์ด๋ฉด A = B, B = N ์œผ๋กœ ๋Œ€์ž…ํ•˜๊ณ  3๋ฒˆ ~ 5๋ฒˆ ๊ณผ์ • ๋ฐ˜๋ณต

์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์œผ๋กœ ์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜ ๊ตฌํ•˜๊ธฐ

์ตœ์†Œ ๊ณต๋ฐฐ์ˆ˜์˜ ํ•ต์‹ฌ์€ GCD์ด๋‹ค.


์œ ํด๋ฆฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด์„œ ๊ตฌํ•œ ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜์— a์™€ b๋ฅผ ๊ฐ๊ฐ ๊ณฑํ•œ ๊ฐ’์„ ๋‚˜๋ˆ ๋งŒ ์ค€๋‹ค๋ฉด ์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

Java๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ

GCD๋ฅผ ์ž๋ฐ”๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ํฌ๊ฒŒ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

  1. ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•œ ๊ตฌํ˜„
  2. ์žฌ๊ท€ํ˜ธ์ถœ์„ ํ†ตํ•œ ๊ตฌํ˜„

๋‘ ๋ฐฉ๋ฒ• ๋ชจ๋‘๋ฅผ ์‚ฌ์šฉํ•ด ๋ณผ ๊ฒƒ์ด๋‹ค.

๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•œ ๊ตฌํ˜„

private static int gcdByLoop(int a, int b) {
  if(a < b) {
    int temp = a;
    a = b;
    b = temp;
  }
  while(b > 0) {
    int temp = b;
    b = a % b;
    a = temp;
  }
  return a;
}

์žฌ๊ท€ํ˜ธ์ถœ์„ ํ†ตํ•œ ๊ตฌํ˜„

private static int gcdByRecursive(int a, int b) {
  if(a < b) {
    int temp = a;
    a = b;
    b = temp;
  }
  if(b == 0) {
    return a;
  }
  return gcdByRecursive(b, a % b);

}

์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜ ๊ตฌํ˜„

private static int lcm(int a, int b) {
  return (a * b) / gcdByLoop(a, b);
}

์‹œ๊ฐ„ ๋ณต์žก๋„

์ผ๋ฐ˜์ ์ธ ๋…ผ๋ฆฌ์— ์˜ํ•ด์„œ ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜, ์ตœ์†Œ ๊ณต๋ฐฐ์ˆ˜๋ฅผ ๊ตฌํ•œ๋‹ค๋ฉด O(N^2)์˜ ์‹œ๊ฐ„์ด ํ‰๊ท ์ ์œผ๋กœ ์†Œ์š”๋œ๋‹ค.

 

ํ•˜์ง€๋งŒ ์œ ํด๋ฆฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•œ๋‹ค๋ฉด O(log N)์ด๋ผ๋Š” ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.

๋Œ“๊ธ€