Algorithm๐Ÿฅ‡

[์ž๋ฃŒ๊ตฌ์กฐ ์ž…๋ฌธ] 05. ์žฌ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜

hae02y 2024. 1. 8. 16:24
๋ฐ˜์‘ํ˜•

์žฌ๊ท€ (recursive)

ํŒฉํ† ๋ฆฌ์–ผ ๊ตฌํ•˜๊ธฐ

package ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋ฌธ.์žฌ๊ท€;

public class Factorial {

static int facto(int x) { //์žฌ๊ท€๋กœ ๊ตฌํ˜„

if(x > 1) {

return x * facto(x-1);

}

return 1;

}

static int facto2(int x) { // ์‚ผํ•ญ์—ฐ์‚ฐ์ž + ์žฌ๊ท€ ๊ตฌํ˜„

return (x > 1) ? x * facto(x-1) : 1;

}

public static void main(String[] args) {

System.out.println(facto2(5));

}



}

์ง์ ‘์žฌ๊ท€์™€ ๊ฐ„์ ‘์žฌ๊ท€

  • ์ง์ ‘์žฌ๊ท€ : A - A - A ํ˜•ํƒœ๋กœ ์ž์‹ ๊ณผ ๋™์ผํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๊ฒƒ
  • ๊ฐ„์ ‘์žฌ๊ท€ : A - B - C ํ˜•ํƒœ๋กœ ๋ฉ”์„œ๋“œ A ๊ฐ€ B๋ฅผ ํ˜ธ์ถœ, B๊ฐ€ C๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ

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

  • ๋‘์ˆ˜์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ๋‘์ˆ˜๋ฅผ ์ง์‚ฌ๊ฐํ˜•์˜ ๋‘๋ณ€์˜ ๊ธธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด์ž. ์ง์‚ฌ๊ฐํ˜•์„ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ๋นˆํ‹ˆ์—†์ด ์ฑ„์šด๋‹ค. ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง€๋Š” ์ •์‚ฌ๊ฐํ˜•๊ฐ€์šด๋ฐ ๊ฐ€์žฅ ๊ธด๋ณ€์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•œ๋‹ค.

์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์žฌ๊ท€์ ์œผ๋กœ ๋ฐ˜๋ณตํ•˜์—ฌ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ฒŒ ๋œ๋‹ค.

์ฆ‰,

  • y=0 ์ผ๋•Œ , ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜ : x
  • y!=0 ์ผ๋•Œ, ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜ : gcd(y, x % y)
package ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋ฌธ.์žฌ๊ท€;

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


static int gcd(int x, int y) {

if(y==0) {

return x;

}

return gcd(y, x % y);

}

public static void main(String[] args) {
int x = 31;

int y = 3;

System.out.println("์ตœ๋Œ€๊ณต์•ฝ์ˆ˜ : " + gcd(x,y));
}

}

์žฌ๊ท€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋ถ„์„

ํ•˜ํ–ฅ์‹ ๋ถ„์„

  • top-down Analysis - ๊ฐ€์žฅ ์œ„์ชฝ์˜ ๋ฉ”์„œ๋“œ๋ถ€ํ„ฐ ์•„๋ž˜๋กœ ํ•˜๋‚˜์”ฉ ๋ถ„์„ํ•ด ๋‚˜๊ฐ€๋Š” ๋ฐฉ๋ฒ•
  • ๊ฐ™์€ ํ˜ธ์ถœ์ด ์—ฌ๋Ÿฌ๋ฒˆ ์žˆ๋Š” ๊ฒฝ์šฐ, ํšจ์œจ์ด ๋–จ์–ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

์ƒํ–ฅ์‹ ๋ถ„์„

  • bottom-up Analysis - ๊ฐ€์žฅ ์•„๋ž˜์ชฝ๋ถ€ํ„ฐ ์Œ“์•„์˜ฌ๋ฆฌ๋ฉฐ ๋ถ„์„์„ ์ง„ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•

์ˆœ์ˆ˜ ์žฌ๊ท€ (genuinely) - ์•„๋ž˜์™€ ๊ฐ™์ด ์žฌ๊ท€ ํ˜ธ์ถœ์„ ์—ฌ๋Ÿฌ๋ฒˆ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ.

public class Recur {

    static void recur(int n) {
        if(n > 0) {
            recur(n-1);
            System.out.println(n);
            recur(n-2);
        }
    }

    public static void main(String[] args) {
        recur(4);
    }

}

์ˆœ์„œ

  1. recur(3) ์‹คํ–‰
  2. 4๋ฅผ ์ถœ๋ ฅ
  3. recur(2) ์‹คํ–‰

ํ•˜๋…ธ์ด์˜ ํƒ‘

ํ•˜๋…ธ์ด์˜ ํƒ‘์€ ์Œ“์•„๋†“์€ ์›๋ฐ˜์„ ์ตœ์†Œ์˜ ํšŸ์ˆ˜๋กœ ์˜ฎ๊ธฐ๊ธฐ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
๋‚˜๋ฌด์œ„ํ‚ค ๋ฐ”๋กœ๊ฐ€๊ธฐ
ํ•˜๋…ธ์ด์˜ํƒ‘ ๊ฒŒ์ž„

๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ์œ„ํ•ด์„œ ํฐ๋ฌธ์ œ๋ฅผ ์ž‘์€๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด์„œ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

package ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋ฌธ.์žฌ๊ท€;

public class TowersOfHanoi {
	
	static int count;
	
	public static void move(int n, int x, int y) {
		
		if(n > 1) {
			move(n-1, x, 6-x-y); //6-x-y ๋ฅผ ํ†ตํ•ด ์ค‘๊ฐ„๊ธฐ๋‘ฅ์„ ์ฐพ์„์ˆ˜์žˆ์Œ.
		}
		
		System.out.printf("%d ํฌ๊ธฐ ์›๋ฐ˜์„ %d๊ธฐ๋‘ฅ์—์„œ %d๊ธฐ๋‘ฅ์œผ๋กœ ์ด๋™ \n", n, x, y);
		count ++;
		
		if(n > 1) {
			move(n-1, 6-x-y, y);
		}
		
	}
	
	public static void main(String[] args) {
		
		int n = 3;
		count = 0;
		
		move(n, 1, 3);
		System.out.println("์ด๋™ํšŸ์ˆ˜ : " + count);
	}
}

 

 

 

8ํ€ธ ๋ฌธ์ œ

์„œ๋กœ ๊ณต๊ฒฉํ•˜์—ฌ ์žก์„์ˆ˜์—†๋„๋ก 8X8 ์ฒด์ŠคํŒ์— ๋†“์œผ์„ธ์š”.

๊ทœ์น™์„ ์„ธ์›Œ์„œ ๋ฌธ์ œ์— ์ ‘๊ทผ์„ ํ•ด์•ผํ•˜๋Š”๋ฐ 64์นธ์˜ ์ฒด์ŠคํŒ์— 1๊ฐœ์˜ ํ€ธ์„ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ์˜์ˆ˜๋Š” 64์ด๊ณ  ๋‹ค์Œ์€ 63 ๋‹ค์Œ์€ 62... ์ด๋Ÿฐ์‹์œผ๋กœ ์กฐํ•ฉ์ด ๋งŒ๋“ค์–ด์ง€๋ฏ€๋กœ

64 x 63 x 62 x ... 57

์ด๋ผ๋Š” ์—„์ฒญ๋‚˜๊ฒŒ ํฐ ์ˆซ์ž์˜ ์กฐํ•ฉ์ด ๋งŒ๋“ค์–ด์ง€๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ž˜์„œ 2๊ฐ€์ง€ ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•ด๋ณด์ž.

  1. ๊ฐ ์—ด์— ํ€ธ์„ 1๊ฐœ๋งŒ ๋ฐฐ์น˜ํ• ์ˆ˜์žˆ๋‹ค.
  2. ๊ฐ ํ–‰์— ํ€ธ์„ 1๊ฐœ๋งŒ ๋ฐฐ์น˜ํ• ์ˆ˜์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋…ธ์ด์˜ํƒ‘์ด๋‚˜ 8ํ€ธ๋ฌธ์ œ์ฒ˜๋Ÿผ ๋ฌธ์ œ๋ฅผ ์ž‘๊ฒŒ ์ชผ๊ฐœ์„œ ์„ธ๋ถ„ํ™”๋œ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ถ„ํ• ์ •๋ณต๋ฒ•(Divide and Conquer) ๋ผ๊ณ  ํ•œ๋‹ค. - ํ€ต์ •๋ ฌ, ๋ณ‘ํ•ฉ์ •๋ ฌ ๋“ฑ

1,2 ๋ฒˆ ๊ทœ์น™์— ๋งˆ์ง€๋ง‰ ๊ทœ์น™์„ ๋”ํ•ด๋ณด์ž.
ํ–‰๊ณผ ์—ด์ด ๊ฒน์น˜์ง€ ์•Š๊ฒŒ ๊ตฌํ˜„ํ•˜์˜€์œผ๋ฏ€๋กœ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋Œ€๊ฐ์„ ๋ฐฉํ–ฅ์„ ์ƒ๊ฐํ•œ๋‹ค.
๋Œ€๊ฐ์„ ๋ฐฉํ–ฅ์€ ์˜ค๋ฅธ์ชฝ์œ„์—์„œ ์™ผ์ชฝ์•„๋ž˜, ์™ผ์ชฝ์œ„์—์„œ ์˜ค๋ฅธ์ชฝ์•„๋ž˜๋กœ ํ–ฅํ•˜๋Š” ๋‘๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด์•ผํ•œ๋‹ค.

๋Œ€๊ฐ์„ ์€ ๋‹ค์Œ๊ณผ๊ฐ™์ด 2๊ฐ€์ง€ ๊ฒฝ์šฐ๋กœ ์ƒ๊ฐ๋œ๋‹ค.

static boolean[] flagLTR = new boolean[15];
static boolean[] flagRTL = new boolean[15]; 

 

์ฝ”๋“œ

package ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋ฌธ.์žฌ๊ท€;

public class Queen8 {

    static int[] pos = new int[8]; //๊ฐ์—ด์— ์กด์žฌํ•˜๋Š” ํ€ธ์˜ ์œ„์น˜
    static boolean[] flag = new boolean[8]; //๊ฐํ–‰์— ํ€ธ์„ ์ด๋ฏธ ๋ฐฐ์น˜ํ–ˆ๋Š”์ง€ ํ™•์ธ
    static boolean[] flagLTR = new boolean[15]; // \ ๋ฐฉํ–ฅ ๋Œ€๊ฐ์„ ์œผ๋กœ ํ€ธ์„ ๋ฐฐ์น˜ํ–ˆ๋Š”์ง€ ํ™•์ธ (Left To Right)
    static boolean[] flagRTL = new boolean[15]; // / ๋ฐฉํ–ฅ ๋Œ€๊ฐ์„ ์œผ๋กœ ํ€ธ์„ ๋ฐฐ์น˜ํ–ˆ๋Š”์ง€ ํ™•์ธ    (Right To Left)

    static void print() {
        for(int i=0; i<pos.length; i++) {
            System.out.printf("%2d", pos[i]);
        }
        System.out.println();
    }

    static void set(int col) {
        for(int row=0; row<pos.length; row++) {

            if(flag[row] == false && 
                flagLTR[row + col] == false && 
                flagRTL[col - row + 7] == false ) {
                    pos[col] = row;
                    if(col == 7) {
                    print();
                    }else {
                        flag[row] = flagLTR[col + row] = flagRTL[col - row + 7] = true;
                        set(col+1);
                        flag[row] = flagLTR[col + row] = flagRTL[col - row + 7] = false;
                }
            }
        }
    }

    public static void main(String[] args) {
        set(0);

    }
}
๋ฐ˜์‘ํ˜•