๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm/์ด๋ก 

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

์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์„ ์ด์šฉํ•œ ์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜ ๊ตฌํ•˜๊ธฐ (C์–ธ์–ด)

๋ฌธ์ œ : BOJ_5347๋ฒˆ LCM

๋ฐฑ์ค€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ๋ณธ ๋ฌธ์ œ๋ฅผ ํ’€๋‹ค ๋ณด๋ฉด, ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜์™€ ์ตœ์†Œ ๊ณต๋ฐฐ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ๋“ค์„ ๋งˆ์ฃผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์œ„์— ๊ฐ€์ ธ์˜จ ๋ฌธ์ œ๋ฅผ ๋ณด๋ฉด ๋‘ ์ˆ˜ a์™€ b๋ฅผ ์ž…๋ ฅํ•ด์„œ ์ตœ์†Œ ๊ณต๋ฐฐ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ์ธ๋ฐ, ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ด์ค‘ for๋ฌธ์„ ์ด์šฉํ•œ ์ด๋Ÿฐ ๋ฌด์‹ํ•œ ์ฝ”๋”ฉ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

#include<stdio.h>
int main(void) {
    int num;
    scanf("%d",&num);
    for(int a=1;num>=a;a++){
        long long num1, num2;
        long long mul1, mul2;
        scanf("%lld %lld",&num1,&num2);
        for(mul1=1;num2>=mul1;mul1++){
            for(mul2=1;num1>=mul2;mul2++){
                if(mul2*num2==mul1*num1) break;
            }
            if(mul2*num2==mul1*num1) break;
        }
        printf("%lld\n",mul2*num2);
    }
    return 0;
}

(์‹œ๊ฐ„์ดˆ๊ณผ์— ๊ฑธ๋ฆฌ๋Š” ๋ฌด์‹ํ•œ ์ฝ”๋”ฉ)


์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋‹ค์†Œ ๋ฌด์‹ํ•œ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ, ๋‘ ์ˆ˜๋ฅผ num1, num2๋ผ๊ณ  ํ•  ๋•Œ for๋ฌธ ์•ˆ์— a*num1 = b*num2 ๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ a์™€ b๋ฅผ ์ด์ค‘ for๋ฌธ ์•ˆ์—์„œ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์œ„ ์†Œ์Šค๋ฅผ ์ปดํŒŒ์ผํ•˜๋ฉด ์›ํ•˜๋Š” ์ตœ๋Œ€ ๊ณต๋ฐฐ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ num1๊ณผ num2๋Š” ๋ฐฑ๋งŒ๊นŒ์ง€ ์ปค์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Ÿฐ ์ฝ”๋”ฉ์€ ์‹œ๊ฐ„ ์ œํ•œ 1์ดˆ๋ฅผ ๋„˜์–ด๋ฒ„๋ฆฌ๋Š” for๋ฌธ์„ ์ดˆ๋ž˜ํ•˜๊ณ  ๋ง™๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ฐ”๋กœ ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์ธ๋ฐ์š”. ์ผ๋‹จ ์ •์˜๋ถ€ํ„ฐ ํ™•์ธํ•˜์ž๋ฉด,

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

๋‘ ์ •์ˆ˜ a, b์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋ฅผ G(a, b)๋ผ๊ณ  ํ•˜์ž.

์ •์ˆ˜ a, b, q r (b ≠ 0)์— ๋Œ€ํ•˜์—ฌ a = bq + r,์ด๋ฉด G(a, b) = G(b, r)๊ฐ€ ์„ฑ๋ฆฝํ•œ๋‹ค.

ใ€ˆ์ฆ๋ช…ใ€‰

G(a, b) = g๋ผ๊ณ  ํ•˜์ž. ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜์˜ ์„ฑ์งˆ์— ์˜ํ•ด a = a′g, b = b′g์ด๊ณ  G(a′, b′) = 1์ด๋‹ค.

a = bq + r๋กœ๋ถ€ํ„ฐ r = a - bq = g(a′ - b′q) ์ด๊ณ , g๋Š” r์˜ ์•ฝ์ˆ˜์ด๋‹ค.

G(b, r) = g์ž„์„ ๋ณด์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” G(b′, a′ - b′q) = 1์ž„์„ ๋ณด์ด๋ฉด ๋œ๋‹ค.

๊ท€๋ฅ˜๋ฒ•์„ ์ ์šฉํ•˜์—ฌ ๊ฒฐ๋ก ์„ ๋ถ€์ •ํ•ด๋ณด์ž.

์–ด๋–ค ์ •์ˆ˜ d๊ฐ€ ์กด์žฌํ•˜์—ฌ G(b′, a′ - b′q) =d(≠ 1)๋ผ๊ณ  ํ•˜๋ฉด, b′ = dm, a′ - b′q = dn๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ณ , a′ = b′q + dn= dmq + dn = d(mq + n) ์ด๋ฏ€๋กœ G(a′, b′) = 1๋ผ๋Š” ๊ฐ€์ •์— ๋ชจ์ˆœ์ด๋‹ค. ๋”ฐ๋ผ์„œ G(b′, a′ - b′q) = 1์ด๋ฏ€๋กœ G(b, r) = g๊ฐ€ ์„ฑ๋ฆฝํ•œ๋‹ค.

์ถœ์ฒ˜:[๋„ค์ด๋ฒ„ ์ง€์‹๋ฐฑ๊ณผ] ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ• (ํ†ตํ•ฉ๋…ผ์ˆ  ๊ฐœ๋…์–ด ์‚ฌ์ „, 2007. 12. 15., ์ฒญ์„œ์ถœํŒ)


์‰ฝ๊ฒŒ ๋งํ•ด a์™€ b์˜ ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด, ๋ชซ์„ q ๋‚˜๋จธ์ง€๋ฅผ r๋กœ ํ‘œํ˜„ํ•œ๋‹ค๋ฉด,
a = bp + r
์ด๊ณ  ์œ„ ์‹์—์„œ a์™€ b์˜ ์ตœ์†Œ ๊ณต๋ฐฐ์ˆ˜๋Š” b์™€ r์˜ ์ตœ์†Œ ๊ณต๋ฐฐ์ˆ˜์™€ ๊ฐ™๋‹ค๋Š” ์ •๋ฆฌ์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ƒ ์ฆ๋ช…์˜ ๋‚ด์šฉ๋ณด๋‹จ ์‚ฌ์šฉ๋ฒ•์„ ์ •ํ™•ํžˆ ์•Œ์•„์•ผ๋˜์ง€๋งŒ, ์œ„์˜ ์ฆ๋ช…์„ ์งง๊ฒŒ ํ•ด์„ํ•ด๋ณด์ž๋ฉด,

a์™€ b์˜ ์„œ๋กœ์†Œ๋ฅผ a'์™€ b'๋กœ ์ •ํ•˜์ง€๊ณ  ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋ฅผ g๋ผ๊ณ  ์ •ํ–ˆ์„ ๋•Œ,
๋‚˜๋จธ์ง€ r์ด g(a′ - b′q)๊ฐ€ ๋˜๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ b'์™€ a′ - b′q๊ฐ€ ์„œ๋กœ์†Œ์ž„์„ ๊ฒฐ๋ก ์„ ๋ถ€์ •ํ•˜์—ฌ ๊ท€๋ฅ˜๋ฒ•์œผ๋กœ ์ฆ๋ช…ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.
(b'์™€ a′ - b′q๊ฐ€ ์„œ๋กœ์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด a'์™€ b'์— ๊ณต์•ฝ์ˆ˜๊ฐ€ ์ƒ๊ธฐ๋ฉด์„œ ๋‘˜์ด ์„œ๋กœ์†Œ๋ผ๋Š” ์ „์ œ์— ์œ„๋ฐฐ)

์ฆ๋ช…์€ ์ด์ฏค์—์„œ ํ•˜๊ณ , ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ชฉ์ ์œผ๋กœ ๋ดค์„ ๋•Œ ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•ด์„œ ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์„ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด,
a์™€ b์˜ ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜๋Š” b์™€ r์˜ ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜์™€ ๊ฐ™๊ณ , b์™€ r์˜ ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜๋Š” ๋˜ ๋‹ค๋ฅธ b'๊ณผ r'์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜์™€ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์—,
๋‚˜๋จธ์ง€์ธ r(n)'์ด 0์ด ๋˜๋Š” ๊ฒฝ์šฐ์—์„œ์˜ b๊ฐ€ ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜์ž„์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ง๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์–ด๋ ต์ง€๋งŒ, ์œ„ํ‚ค๋ฐฑ๊ณผ์—์„œ ๊ฐ€์ ธ์˜จ ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์˜ ์˜ˆ๋ฅผ ๋ณด๋ฉด,


์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์„ ์ด์šฉํ•œ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜ ๊ตฌํ•˜๊ธฐ (์ถœ์ฒ˜ : ์œ„ํ‚ค๋ฐฑ๊ณผ)


๋งˆ์ง€๋ง‰์—์„œ 72 = 36 x 2(๋ชซ) + 0(๋‚˜๋จธ์ง€) ์ž„์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฏ€๋กœ a,b๋ฅผ ํ˜ธ์ถœ ์‹œ, b๊ฐ€ 0์ด ๋˜๊ณ , a๊ฐ€ ๋งˆ์ง€๋ง‰ ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜๊ฐ€ ๋˜๋Š” ํ•จ์ˆ˜์‹์„ ๋งŒ๋“ ๋‹ค๋ฉด, ```c int gcd(int a, int b) { int c; while (b) { c = a; a = b; b = c % a; } ```

(์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ• ํ•จ์ˆ˜)


์œ„์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (b==0 ์ผ ๋•Œ while ๋ฌธ์ด ์ข…๋ฃŒ๋จ์œผ๋กœ)
*์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜๋Š” ํŽธ์˜์ƒ gcd(greatest common divisor)๋กœ ๋งŽ์ด ์”๋‹ˆ๋‹ค.
์œ„์˜ ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์„ ์ด์šฉํ•ด์„œ ์•ž์„œ ์†Œ๊ฐœํ•ด๋“œ๋ฆฐ ๋ฐฑ์ค€ ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ํ’€์–ด๋ณธ๋‹ค๋ฉด,

์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์„ ์‘์šฉํ•œ ํ’€์ด

#include <stdio.h>
int gcd(int a, int b);
int main() {
    int roof,i;
    scanf("%d", &roof);
    for (i = 1; i <= roof; i++) {
        int num1, num2, num3;
        scanf("%d %d", &num1, &num2);
        if (num1 >= num2) {
            num3 = gcd(num1, num2);
        }
        else num3 = gcd(num2, num1);
        printf("%d\n", num3*(num1 / num3)*(num2 / num3));
    }
    return 0;
}
int gcd(int a, int b) {
    int c;
    while (b) {
        c = a;
        a = b;
        b = c % a;
    }
    return a;
}

(5347๋ฒˆ ํ’€์ด ์ฝ”๋”ฉ)


์œ„์™€ ๊ฐ™์ด ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•œ ๋’ค, num1๊ณผ num2๋ฅผ ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜๋กœ ๋‚˜๋ˆˆ ๋ชซ์„ ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜์— ๊ณฑํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ตœ์†Œ ๊ณต๋ฐฐ์ˆ˜๋ฅผ ์ถœ๋ ฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.