Processing math: 100%

ABOUT ME

-

  • μœ ν΄λ¦¬λ“œ μ•Œκ³ λ¦¬μ¦˜ - 두 수의 μ΅œλŒ€κ³΅μ•½μˆ˜λŠ”?🀨
    ALicademy πŸ‘©β€πŸ«πŸ‘¨β€πŸ«/μ•Œκ³ λ¦¬μ¦˜ 2021. 7. 4. 23:55

    πŸš€Intro

    치λ§₯의 κ³ μž₯인 λ§₯μΉ˜λ§ˆμ„μ—μ„œλŠ” 맀년 치λ§₯μΆ•μ œπŸ—πŸΊλ₯Ό μ—½λ‹ˆλ‹€. μ˜¬ν•΄λŠ” μΆ•μ œλ₯Ό μœ„ν•΄ μΉ˜ν‚¨ 4,500λ§ˆλ¦¬πŸ—μ™€ λ§₯μ£Ό 7,500μž”πŸΊμ„ μ€€λΉ„ν–ˆμŠ΅λ‹ˆλ‹€. 이것듀을 μ΅œλŒ€ν•œ λ§Žμ€ μ‚¬λžŒλ“€μ—κ²Œ 남김없이 λ˜‘κ°™μ΄ λ‚˜λˆ„μ–΄ μ£Όλ €κ³  ν•  λ•Œ, 1️⃣ μ΅œλŒ€ λͺ‡ λͺ…μ—κ²Œ λ‚˜λˆ„μ–΄ 쀄 수 있으며 2️⃣ ν•œ μ‚¬λžŒ λ‹Ή μΉ˜ν‚¨ λͺ‡ λ§ˆλ¦¬μ™€ λ§₯μ£Ό λͺ‡ μž”μ„ 받을 수 μžˆμ„κΉŒμš”?

     

    문제λ₯Ό λͺ¨λ‘ λ§žμΆ”μ…¨λ‚˜μš”? μ—¬λŸ¬λΆ„μ΄ 이미 μ•Œκ³  κ³„μ‹œλ“―μ΄ 1οΈβƒ£λ²ˆ 문제의 닡은 4,500κ³Ό 7,500의 'μ΅œλŒ€ κ³΅μ•½μˆ˜(Greatest Common Divisor)'인 150λͺ…μž…λ‹ˆλ‹€. λ˜ν•œ 2οΈβƒ£λ²ˆ 문제의 닡은 μΉ˜ν‚¨ 4,500λ§ˆλ¦¬μ™€ λ§₯μ£Ό 7,500μž”μ„ μ΅œλŒ€ κ³΅μ•½μˆ˜μΈ 150으둜 λ‚˜λˆˆ 3λ§ˆλ¦¬μ™€ 5μž”μž…λ‹ˆλ‹€. (ν•œ μ‚¬λžŒλ‹Ή μΉ˜ν‚¨ μ„Έ λ§ˆλ¦¬πŸ“πŸ“πŸ“μ™€ λ§₯μ£Ό 5μž”πŸΊπŸΊπŸΊπŸΊπŸΊμ΄λΌλ‹ˆ... 정말 쒋은 μΆ•μ œλ„€μš”πŸ˜‹)

     

    κ·Έλ ‡λ‹€λ©΄ λ§Œμ•½ nλ…„ ν›„ 치λ§₯μΆ•μ œπŸ—πŸΊκ°€ μ „μ„Έκ³„μ μœΌλ‘œ λŒ€λ°•μ΄ λ‚˜λ©΄μ„œ μΉ˜ν‚¨ 9,876,543λ§ˆλ¦¬πŸ—μ™€ λ§₯μ£Ό 3,456,789μž”πŸΊλ₯Ό μ€€λΉ„ν•œλ‹€κ³  ν•  λ•Œ, 1οΈβƒ£λ²ˆ λ¬Έμ œμ™€ 2οΈβƒ£λ²ˆ 문제의 닡은 각각 λ¬΄μ—‡μΌκΉŒμš”?

     

    μ•„λ§ˆ λ°”λ‘œ 닡을 κ΅¬ν•˜κΈ΄ μ–΄λ €μš°μ‹€ 것 κ°™μ€λ°μš”. 컴퓨터가 λŒ€μ‹  κ΅¬ν•΄λ³΄κ²Œ ν•˜λŠ” 것 μ–΄λ–¨κΉŒμš”?

     

    πŸ’­μ΅œλŒ€ κ³΅μ•½μˆ˜ κ΅¬ν•˜κΈ°

    두 μ •μˆ˜ a, b (a>b)의 μ΅œλŒ€ κ³΅μ•½μˆ˜λ₯Ό gcd(a,b)라고 ν•©μ‹œλ‹€. gcd(a,b)λ₯Ό μ»΄ν“¨ν„°λ‘œ μ–΄λ–»κ²Œ ꡬ할 수 μžˆμ„κΉŒμš”?

    1. Brute-force πŸ₯Š

    κ°€μž₯ λ¨Όμ € λ¬΄μ‹ν•˜κ²Œ κ΅¬ν•˜λŠ” 방법이 μžˆμŠ΅λ‹ˆλ‹€. gcd(a,b)λŠ” 1λΆ€ν„° b 쀑 a, b λͺ¨λ‘μ™€ λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” κ°€μž₯ 큰 μˆ˜μž…λ‹ˆλ‹€. λ”°λΌμ„œ 1λΆ€ν„° bκΉŒμ§€ μ°¨λ‘€λ‘œ μ¦κ°€ν•˜λ©° a, b λͺ¨λ‘μ™€ λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ”μ§€ ν™•μΈν•˜λ©΄ λ©λ‹ˆλ‹€.

     

    이 μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•œ μ½”λ“œλŠ” μ•„λž˜μ™€ κ°™κ³  β°μ‹œκ°„ λ³΅μž‘λ„λŠ” O(b)μž…λ‹ˆλ‹€.

    int gcd_brute(int a, int b)
    {
    int _gcd = 0;
    for(int i = 1; i <= b; i++)
    if(a % i == 0 && b % i == 0) _gcd = i;
    return _gcd;
    }
    view raw gcd_brute.cpp hosted with ❀ by GitHub

     

    2. κ³΅μ•½μˆ˜μ˜ μ„±μ§ˆ μ΄μš©ν•˜κΈ°

    μ΄λ²ˆμ—λŠ” μš°μ•„ν•˜κ²Œ μˆ˜ν•™πŸ’«μ„ μ΄μš©ν•΄λ³ΌκΉŒμš”?

    κ³΅μ•½μˆ˜μ˜ μ„±μ§ˆ 쀑 ν•˜λ‚˜λŠ” '두 μ •μˆ˜ a, b (a>b)의 κ³΅μ•½μˆ˜μ˜ 집합은 aβˆ’b와 b의 κ³΅μ•½μˆ˜ 집합과 κ°™λ‹€'λŠ” κ²ƒμž…λ‹ˆλ‹€. 이 μ„±μ§ˆμ€ μ•„λž˜μ™€ 같이 κ°„λ‹¨ν•˜κ²Œ 증λͺ…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

     

    pf.a, bμ˜κ³΅μ•½μˆ˜ gκ°€ μžˆλ‹€κ³  ν•˜μž.κ·Έλ ‡λ‹€λ©΄ a=aβ€²g, b=bβ€²g라고 ν•  μˆ˜ μžˆλ‹€. μ΄λ•Œ, aβˆ’b=(aβ€²βˆ’bβ€²)g μ΄λ―€λ‘œa, b의 κ³΅μ•½μˆ˜μ˜ μ§‘합은 aβˆ’b와 b의 κ³΅μ•½μˆ˜μ˜ μ§‘ν•©κ³Ό κ°™λ‹€.

     

    이 μ„±μ§ˆμ„ μ΄μš©ν•˜λ©΄ μ•„λž˜μ™€ 같은 μ½”λ“œλ₯Ό κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    int gcd_math(int a, int b)
    {
    if(a < b) swap(a, b);
    return (b) ? gcd_math(a - b, b) : a;
    }
    view raw gcd_math.cpp hosted with ❀ by GitHub

     

    μ΄λ•Œ β°μ‹œκ°„ λ³΅μž‘λ„λŠ” n=a+b라고 ν•  λ•Œ, O(n)μž…λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ gcd(a,b)λŠ” μ΅œλŒ€ a+b번 λ°˜λ³΅ν•˜κΈ° λ•Œλ¬ΈμΈλ° λ‹€μŒκ³Ό 같이 증λͺ…ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ°„λ‹¨ν•˜κ²ŒλŠ” μ΅œμ•…μ˜ 경우 즉, gcd(a,1)일 λ•Œ ν•¨μˆ˜κ°€ λͺ‡ 번 μ‹€ν–‰λ˜λŠ”μ§€ μ„ΈλŠ” 방법도 μžˆμŠ΅λ‹ˆλ‹€.

     

    pf.두 μ •μˆ˜ a, b(a>b)에 λŒ€ν•˜μ—¬gcd(a,b)=gcd(aβˆ’b,b)=gcd(aβ€²,bβ€²)라고 ν•˜μž. μ΄λ•Œ λ‹€μŒμ™€ κ°™μ€ κ΄€κ³„κ°€ μ„±λ¦½ν•œλ‹€.{aβ€²=aβˆ’bbβ€²=b κ·Έλ¦¬κ³  aβ€²+bβ€²=a<a+b μ΄λ‹€.λ”°λΌμ„œ gcd(a,b)λŠ” μ΅œλŒ€ a+b번 λ°˜λ³΅ν•œλ‹€.

     

    μš°μ•„ν•˜κ²Œ μˆ˜ν•™μ„ μ΄μš©ν–ˆλŠ”λ° κ²°κ³ΌλŠ” κ·Έλ ‡κ²Œ λ§Œμ‘±μŠ€λŸ½μ§€λŠ” μ•Šλ„€μš”...πŸ˜‚

    κ·Έλ ‡λ‹€λ©΄ κ³΅μ•½μˆ˜μ˜ λ‹€λ₯Έ μ„±μ§ˆμ„ μ΄μš©ν•΄λ³΄λ©΄ μ–΄λ–¨κΉŒμš”?

     

    πŸ”’μœ ν΄λ¦¬λ“œ μ•Œκ³ λ¦¬μ¦˜

    μœ ν΄λ¦¬λ“œ μ•Œκ³ λ¦¬μ¦˜μ€ 역사상 κ°€μž₯ 였래된 μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ 유λͺ…ν•˜κ³  μ•„λž˜μ™€ 같은 μ„±μ§ˆμ„ μ΄μš©ν•˜μ—¬ 두 수의 μ΅œλŒ€ κ³΅μ•½μˆ˜λ₯Ό κ΅¬ν•©λ‹ˆλ‹€.

     

    두 μ •μˆ˜ a, b (a>b)에 λŒ€ν•˜μ—¬ gcd(a, b)=gcd(b, amodb)이닀.

     

    이 μ„±μ§ˆμ€ λ‹€μŒκ³Ό 같이 κ°„λ‹¨ν•˜κ²Œ 증λͺ…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

     

    pf.r=amodb, a=bΓ—t+r (t∈Z)라고 ν•˜μž. Case 1. d=gcd(a,b)μΌλ•Œ, d∣(bΓ—t+r)이고 d∣b이닀.λ”°λΌμ„œ, d∣r이닀. κ·ΈλŸ¬λ―€λ‘œ, gcd(a,b)=gcd(b,r)이닀. Case 2. c=gcd(b,r)μΌλ•Œ, c∣b이고 c∣r이닀.λ”°λΌμ„œ, c∣a이닀. κ·ΈλŸ¬λ―€λ‘œ, gcd(b,r)=gcd(a,b)이닀. λ”°λΌμ„œ,gcd(a,b)=gcd(b,r)이닀.

     

    이 μ„±μ§ˆμ„ μ΄μš©ν•˜λ©΄ μ•„λž˜μ™€ 같은 μ½”λ“œλ‘œ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    int gcd(int a, int b)
    {
    return (b) ? gcd(b, a % b) : a;
    }
    view raw gcd.cpp hosted with ❀ by GitHub

     

    흠... 근데 κ³Όμ—° 이 방법이 λ‹€λ₯Έ 방법듀 보닀 λΉ λ₯ΌκΉŒμš”? πŸ€”

     

    β°λ³΅μž‘λ„ 뢄석

    μ•Œκ³ λ¦¬μ¦˜μ˜ λ³΅μž‘λ„λ₯Ό λΆ„μ„ν•˜λŠ” μ—¬λŸ¬ 방법듀이 μžˆμŠ΅λ‹ˆλ‹€. κ·Έ 쀑 κ°„λ‹¨ν•˜κ²Œ 맀 μ‹€ν–‰λ§ˆλ‹€ 쀄어든 자료의 크기둜 톡해 λ³΅μž‘λ„λ₯Ό λΆ„μ„ν•˜λŠ” 방법이 μžˆμŠ΅λ‹ˆλ‹€. 그럼 ν•œ 번 λΆ„μ„ν•΄λ³ΌκΉŒμš”?

     

    μœ ν΄λ¦¬λ“œ μ•Œκ³ λ¦¬μ¦˜μ€ 두 μ •μˆ˜ a, b (a>b)에 λŒ€ν•˜μ—¬ bκ°€ 0이 될 λ•ŒκΉŒμ§€ 반볡적으둜 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.

    그럼 μ•„λž˜μ™€ 같이 경우λ₯Ό λ‚˜λˆ μ„œ μƒκ°ν•΄λ³΄λŠ” 건 μ–΄λ–¨κΉŒμš”?πŸ’‘

     

    gcd(a,b)=gcd(aβ€²,bβ€²)=gcd(b,amodb)라고 ν•  λ•Œ Case 1 : b (=aβ€²)>a2 amodb(=bβ€²)=aβˆ’b<a2 Case 2 : b(=aβ€²)≀a2 amodb(=bβ€²)<b≀a2

     

    경우λ₯Ό λ‚˜λˆ λ³΄λ‹ˆ amodb<a2인 것이 λΆ„λͺ…ν•΄μ‘ŒμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ―€λ‘œ 맀 μ‹€ν–‰λ§ˆλ‹€ 자료의 크기가 절반 이상 μ€„μ–΄λ“ λ‹€λŠ” 사싀을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, β°μ‹œκ°„ λ³΅μž‘λ„λŠ” O(log(min(a,b))μž…λ‹ˆλ‹€.

     

    Let's do PSπŸ˜†

    그럼 였늘 κ³΅λΆ€ν•œ λ‚΄μš©λ“€λ‘œ 문제λ₯Ό ν•΄κ²°ν•΄λ³ΌκΉŒμš”?

    였늘 ν•΄κ²°ν•  λ¬Έμ œλŠ” BOJ 2609 - μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜μž…λ‹ˆλ‹€.

    λ¨Όμ € 슀슀둜 ν•΄κ²°ν•΄λ³΄μ‹œκ³  도움이 ν•„μš”ν•˜μ‹œλ©΄ μ•„λž˜ μ½”λ“œλ₯Ό μ°Έκ³ ν•˜μ„Έμš”.

    더보기
    #include <cstdio>
    int gcd(int a, int b)
    {
    return (b) ? gcd(b, a % b) : a;
    }
    int main()
    {
    int n1, n2, _gcd;
    scanf("%d %d", &n1, &n2);
    _gcd = gcd(n1, n2);
    printf("%d\n%d", _gcd, (n1 * n2) / _gcd);
    return 0;
    }
    view raw boj2609.cpp hosted with ❀ by GitHub

     

    Further Thinking🧐

    gcd(a,b)=d 라고 ν•  λ•Œ d=ax+dy (x,y∈Z)둜 μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    μ™œλƒν•˜λ©΄ dλŠ” a,b의 μ΅œλŒ€ κ³΅μ•½μˆ˜μ΄κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. κ·Έλ ‡λ‹€λ©΄ μ΄λ•Œ x와 y의 값은 μ–΄λ–»κ²Œ μ•Œ 수 μžˆμ„κΉŒμš”?

    그리고 이걸 λ„λŒ€μ²΄ 어디에 μ‘μš©ν•  수 μžˆμ„κΉŒμš”?

    그것듀은 λ‹€μŒ κ°•μ˜μ—μ„œ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€. πŸ‘¨β€πŸ«πŸ‘¨β€πŸ«πŸ‘¨β€πŸ«

     

    πŸ“šμ°Έκ³ 

    https://ko.wikipedia.org/wiki/μœ ν΄λ¦¬λ“œ_ν˜Έμ œλ²•

    https://book.algospot.com/

    https://codility.com/media/train/10-Gcd.pdf

     

    λŒ“κΈ€

Designed by Tistory.