๐Ÿ“š ์†Œ์ˆ˜, ์†Œ์ธ์ˆ˜๋ถ„ํ•ด / ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜, ์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜

temprmnยท2023๋…„ 8์›” 2์ผ
0
post-thumbnail

์†Œ์ˆ˜, ์†Œ์ธ์ˆ˜๋ถ„ํ•ด

์ฐธ๊ณ :

์†Œ์ˆ˜ ํŒ๋ณ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜

2๋ถ€ํ„ฐ ํŒ๋ณ„ํ•˜๋Š” ์ˆ˜์˜ โˆšN ๊นŒ์ง€ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•

public class Main {
    public static boolean isPrime(int num) {
        for (int i = 2; i * i <= num; i++) {
            if (num % i == 0) return false;
        }
        return true;
    }

    public static void main(String[] args) {
       System.out.println(isPrime(80));
       System.out.println(isPrime(79));
    }
}

์šฐ๋ณ€์— ๋ฃจํŠธ๋ฅผ ์”Œ์›Œ์ฃผ๋ ค๋ฉด โ†’ i <= Math.sqrt(num);

์†Œ์ธ์ˆ˜๋ถ„ํ•ด ์•Œ๊ณ ๋ฆฌ์ฆ˜

for(int i = 2; i <= sqrt(N); i++) {	// ๋˜๋Š” i * i <= N
	while(N % i == 0) {
		println(i);
		N /= i;   // *
	}
}
 
if(N != 1) {  // ์ด๊ฑธ ์จ์ฃผ๋Š” ์ด์œ  โ†“
	println(N);
}
  • ์ด ๋•Œ ์ค‘์š”ํ•œ ์ ์€, N /= i๋กœ ๋‚˜๋ˆ„๊ณ , ๋‚จ์€ ์ตœ์ข… N์ด ๋‘ ๊ฐ€์ง€ ์ผ€์ด์Šค๋กœ ๋‚˜๋‰œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  1. N = 16์ผ ๋•Œ (โˆšN = ์ •์ˆ˜์ผ ๋•Œ)
    • ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ โˆšN๊นŒ์ง€ ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด 4๊นŒ์ง€ ๋ฐ˜๋ณต
      โ†’ 1์ด ์ธ์ˆ˜๋ถ„ํ•ด ๋˜๋Š” ์ผ์€ ์—†์œผ๋ฏ€๋กœ for๋ฌธ ์ข…๋ฃŒ โ†’ (๋ฌธ์ œ ์—†์Œ)
  2. N = 34์ผ ๋•Œ (โˆšN = ์‹ค์ˆ˜์ผ ๋•Œ)
    • ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ โˆšN๊นŒ์ง€ ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ๊ทผ์‚ฌ๊ฐ’์ด ๋Œ€๋žต 5.83์ด๋ฏ€๋กœ 5๊นŒ์ง€ ๋ฐ˜๋ณต
      โ†’ i = 5 ๊ฐ€ ๋˜๋ฉด for๋ฌธ ์ข…๋ฃŒ
      โ†’ N์€ 17์ด๋ผ๋Š” ์ธ์ˆ˜๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š”๋ฐ ์ถœ๋ ฅ์„ ๋ชปํ•˜๊ณ  ์ข…๋ฃŒ
    • ์ฆ‰, for๋ฐ˜๋ณต๋ฌธ์ด ์ข…๋ฃŒ๋˜์—ˆ์„ ์‹œ์ ์—, N โ‰  1์ด๋ผ๋ฉด,
      N์€ ์†Œ์ˆ˜์ด์ž ์ธ์ˆ˜์ธ ๊ฒƒ์ด ์ž๋ช…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฒˆ ๋” ์ถœ๋ ฅํ•ด์ฃผ๋Š” ์กฐ๊ฑด๋ฌธ์ด ํ•„์š”ํ•˜๋‹ค!!

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

์ฐธ๊ณ :

์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ• (Euclidean algorithm)์ด๋ž€?

ํ˜ธ์ œ๋ฒ•: ๋‘ ์ˆ˜๊ฐ€ ์„œ๋กœ ์ƒ๋Œ€๋ฐฉ ์ˆ˜๋ฅผ ๋‚˜๋ˆ„์–ด์„œ ๊ฒฐ๊ตญ ์›ํ•˜๋Š” ์ˆ˜๋ฅผ ์–ป๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์˜๋ฏธ.

๋‘ ๊ฐœ์˜ ์ˆ˜ A, B๊ฐ€ ์กด์žฌํ•˜๊ณ , A๋ฅผ B๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ C๋ผ๊ณ  ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. (A > B)

์ด ๋•Œ, A์™€ B์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋Š” B์™€ C์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ex. A = 21, B = 14, C = 7 โ†’ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜ 7

์ด๋Ÿฌํ•œ ์„ฑ์งˆ์„ ์ด์šฉํ•ด์„œ ๊ณ„์†์ ์œผ๋กœ ๋‚˜๋ˆ—์…ˆ์„ ์ง„ํ–‰ํ•ด์„œ C๊ฐ€ 0์ด ๋˜์—ˆ์„ ๋•Œ, ์ฆ‰ ๋‚˜๋จธ์ง€๊ฐ€ 0์ด ๋˜์—ˆ์„ ๋•Œ์˜ ๋‚˜๋ˆ„๋Š” ์ˆ˜๊ฐ€ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ตœ๋Œ€๊ณต์•ฝ์ˆ˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

1. ๋‘ ์ˆ˜์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜

  1. ์žฌ๊ท€
  • b๊ฐ€ 0์ด๋ผ๋ฉด a๊ฐ€ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๊ฐ€ ๋œ๋‹ค.
  • ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด b์™€ a % b์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ฐ˜๋ณตํ•˜์—ฌ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.
public static int gcd(int a, int b) {
    if (b == 0) return a;
    return gcd(b, a % b);  //์ด ๋ถ€๋ถ„์ด ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์˜ ํ•ต์‹ฌ
}
  1. ๋ฐ˜๋ณต๋ฌธ
private int gcd(int max, int min) { // max=21, min=14
    while (max % min != 0) {
        int temp = max; // max=21, min=14, temp=21
        max = min; // max=14, min=14, temp=21

        // ์ด ๋ถ€๋ถ„์ด ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์˜ ํ•ต์‹ฌ
        min = temp % min; // min=๋‘ ์ˆ˜๋ฅผ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๊ฐ’ // max=14, min=7, temp=21
    }
    return min;
}

2. N๊ฐœ ์ˆ˜์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜

๐Ÿ’ก ํ•ด๋‹น ๋ถ€๋ถ„์—์„œ๋Š” int[] arr ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€ ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ ๋ฐฐ์—ด์— ์žˆ๋Š” ๋ชจ๋“  ์ˆ˜์˜ โ€œ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜โ€๋ฅผ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

  1. result ๋ณ€์ˆ˜๋ฅผ ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค

  2. ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ๋ฐฐ์—ด์˜ ๋‚˜๋จธ์ง€ ๊ฐ’๋“ค๊ณผ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•˜์—ฌ result ๋ณ€์ˆ˜์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

  3. ์ตœ์ข…์ ์œผ๋กœ result ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ’์ด ๋ฐฐ์—ด์— ์žˆ๋Š” ๋ชจ๋“  ์ˆ˜์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

// ๋‘ ์ˆ˜์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋ฅผ ์ผ๋‹จ ๊ตฌํ•˜๋Š” ๋ฉ”์„œ๋“œ ์ •์˜
public static int gcd(int a, int b) {
    if (b == 0) return a;
    return gcd(b, a % b);
}

public static int gcd(int[] arr) { //int[] arr๊ฐ€ N์ˆ˜
    int result = arr[0];
    for (int i = 1; i < arr.length; i++) {
        result = gcd(result, arr[i]);
    }
    return result;
}

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

1. ๋‘ ์ˆ˜์˜ ์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜

  1. ์žฌ๊ท€
public static int lcm(int a, int b) { //a=100, b=25, gcd(a,b)=25
    return a * b / gcd(a, b); //2500/25=100
}

2. N๊ฐœ ์ˆ˜์˜ ์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜

๐Ÿ’ก ํ•ด๋‹น ๋ถ€๋ถ„์—์„œ๋Š” int[] arr ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€ ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ ๋ฐฐ์—ด์— ์žˆ๋Š” ๋ชจ๋“  ์ˆ˜์˜ โ€œ์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜โ€๋ฅผ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

  1. result ๋ณ€์ˆ˜๋ฅผ ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค

  2. ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ๋ฐฐ์—ด์˜ ๋‚˜๋จธ์ง€ ๊ฐ’๋“ค๊ณผ ์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜๋ฅผ ๊ตฌํ•˜์—ฌ result ๋ณ€์ˆ˜์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

  3. ์ตœ์ข…์ ์œผ๋กœ result ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ’์ด ๋ฐฐ์—ด์— ์žˆ๋Š” ๋ชจ๋“  ์ˆ˜์˜ ์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

public static int lcm(int a, int b) {
    return (a * b) / gcd(a, b);
}

public static int lcm(int[] arr) {
    int result = arr[0];
    for (int i = 1; i < arr.length; i++) {
        result = lcm(result, arr[i]);
    }
    return result;
}
profile
`ISFJ` T 49% F 51% /

0๊ฐœ์˜ ๋Œ“๊ธ€