λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
CS/μ•Œκ³ λ¦¬μ¦˜

μ΅œλŒ€κ³΅μ•½μˆ˜(GCD), μ΅œμ†Œκ³΅λ°°μˆ˜(LCM) κ΅¬ν•˜κΈ° μœ ν΄λ¦¬λ“œ ν˜Έμ œλ²• μ•Œκ³ λ¦¬μ¦˜ :: μ½”λ“œμžλͺ½

by πŸŒ»β™š 2019. 12. 22.

μ΅œλŒ€κ³΅μ•½μˆ˜ GCD(Greatest Common Divisor)

μ΅œλŒ€κ³΅μ•½μˆ˜λŠ” λ‘ μžμ—°μˆ˜μ˜ κ³΅ν†΅λœ μ•½μˆ˜ 쀑 κ°€μž₯ 큰 수λ₯Ό μ˜λ―Έν•œλ‹€.
ex) 72 μ™€ 30의 μ΅œλŒ€κ³΅μ•½μˆ˜λŠ” 6이닀.
 
 

μ΅œμ†Œκ³΅λ°°μˆ˜ LCM(Least Common Multiple)

μ΅œμ†Œκ³΅λ°°μˆ˜λŠ” 두 μžμ—°μˆ˜μ˜ κ³΅ν†΅λœ 배수 쀑 κ°€μž₯ μž‘μ€ 수λ₯Ό μ˜λ―Έν•œλ‹€.
μ΅œμ†Œκ³΅λ°°μˆ˜ = 두 μžμ—°μˆ˜μ˜ κ³± / μ΅œλŒ€κ³΅μ•½μˆ˜

ex) 72 μ™€ 30의 μ΅œμ†Œκ³΅λ°°μˆ˜λŠ” 360이닀.

 

 

μœ ν΄λ¦¬λ“œ ν˜Έμ œλ²•(Euclidean Algorithm)

2개의 μžμ—°μˆ˜λ₯Ό λ°›μ•„ μ΅œλŒ€κ³΅μ•½μˆ˜λ₯Ό λ°›κΈ° μœ„ν•΄ 2λΆ€ν„° 두 μžμ—°μˆ˜ 쀑 μž‘μ€ μžμ—°μˆ˜κΉŒμ§€ λͺ¨λ‘ λ‚˜λˆ„μ–΄λ³΄λ©΄μ„œ κ°€μž₯ 큰 κ³΅μ•½μˆ˜λ₯Ό ꡬ할 수 μžˆλ‹€.

μœ„μ™€ 같은 λ°©λ²•μœΌλ‘œ 문제λ₯Ό ν’€λ©΄ μ‹œκ°„λ³΅μž‘λ„λŠ” O(N)이 λœλ‹€. λ‚˜μœ 방법은 μ•„λ‹ˆμ§€λ§Œ νš¨μœ¨μ„ 높이기 μœ„ν•΄ μœ ν΄λ¦¬λ“œ ν˜Έμ œλ²•μ΄λž€ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜λ©΄ μ‹œκ°„λ³΅μž‘λ„λ₯Ό O(logN)으둜 μ€„일 수 μžˆλ‹€.

 

μ •μ˜

2개의 μžμ—°μˆ˜  a, b에 λŒ€ν•΄μ„œ aλ₯Ό b둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό r이라 ν•˜λ©΄ (단 a>b), a와 b의 μ΅œλŒ€κ³΅μ•½μˆ˜λŠ” b와 r의 μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ κ°™λ‹€. 이 μ„±μ§ˆμ— 따라, bλ₯Ό r둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€ r0λ₯Ό κ΅¬ν•˜κ³ , λ‹€μ‹œ r을 r0둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό κ΅¬ν•˜λŠ” 과정을 λ°˜λ³΅ν•˜μ—¬ λ‚˜λ¨Έμ§€κ°€ 0이 λ˜μ—ˆμ„ λ•Œ λ‚˜λˆ„λŠ” μˆ˜κ°€ a와 b의 μ΅œλŒ€κ³΅μ•½μˆ˜μ΄λ‹€. μ΄λŠ” λͺ…μ‹œμ μœΌλ‘œ 기술된 κ°€μž₯ 였래된 μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œμ„œλ„ μ•Œλ €μ Έ 있으며, 기원전 300년경에 쓰인 μœ ν΄λ¦¬λ“œμ˜ <원둠> 제7ꢌ, λͺ…μ œ 1λΆ€ν„° 3κΉŒμ§€μ— ν•΄λ‹Ήν•œλ‹€.

 

즉, μ•„λž˜μ™€ 같은 μˆ˜μ‹μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.

 

μ˜ˆμ‹œ

72와 30의 μ΅œμ†Œκ³΅λ°°μˆ˜λ₯Ό μœ ν΄λ¦¬λ“œ ν˜Έμ œλ²•μ„ μ΄μš©ν•΄ κ΅¬ν•˜λŠ” 방법을 ν‘œλ‘œ ν™•μΈν•΄λ³΄μž
SEQ  GCD(A,B) A B A%B
1 GCD(72,30)  72  30  12 
2 GCD(30,12)  30  12 
3 GCD(12,6)  12 

 

 

μœ ν΄λ¦¬λ“œ ν˜Έμ œλ²•μ— μ˜ν•˜μ—¬ ν•΄λ‹Ή μˆœμ„œλŒ€λ‘œ  A%Bκ°€ 0μ΄λ˜λŠ” μˆœκ°„ B의 κ°’ 6이 μ΅œμ†Œκ³΅λ°°μˆ˜κ°€ λœλ‹€.

 

 

λ°±μ€€ 2609문제 μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜

 

 

풀이

μœ ν΄λ¦¬λ“œ ν˜Έμ œλ²•μ„ μž¬κ·€ν•¨μˆ˜λ‘œ λ§Œλ“€μ–΄ μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜λ₯Ό κ΅¬ν•œλ‹€.

 

 Java

import java.util.Scanner;

public class Main{
    public static int gcd(int num1, int num2){
        if(num2 == 0) return num1;
        else return gcd(num2, num1 % num2);
    }
    
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int num1 = sc.nextInt(), num2 = sc.nextInt();
        int gcd = gcd(num1, num2);
        System.out.println(gcd);
        System.out.println(num1 * num2 / gcd);
    }
}

 

 

λŒ“κΈ€