N Queens problem

๋ฌธ์ œ

  • ์ƒํ•˜์ขŒ์šฐ ๋Œ€๊ฐ์„ ๊นŒ์ง€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋ง์ธ ํ€ธ์„ ์ฒด์ŠคํŒ์— ๋‘”๋‹ค๊ณ  ํ•˜์ž. N๊ฐœ์˜ ํ€ธ์ด ์ฒด์ŠคํŒ์—์„œ ์„œ๋กœ ๊ณต์กดํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๋งํ•ด๋ผ.

ํ’€์ด

ํžŒํŠธ

  • ๋˜์ถ”์ ๊ธฐ๋ฒ• Back Tracking

    • ๋ฌธ์ œ๋ฅผ ํ’€๋‹ค๊ฐ€ ๋ง‰๋‹ค๋ฅธ ๊ธธ์— ๋‹ค๋‹ค๋ฅผ ๋•Œ, ๊ฐ€์žฅ ์ตœ๊ทผ์— ํ–ˆ๋˜ ๊ฒฐ์ •์„ ๋ฒˆ๋ณตํ•˜๋ฉฐ ๋‹ค์‹œ ํ’€์–ด๊ฐ€๋Š” ๋ฐฉ๋ฒ•

    • ์ƒํƒœ๊ณต๊ฐ„ํŠธ๋ฆฌ๋ฅผ ๊นŠ์ด ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜์—ฌ ํ•ด๋ฅผ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

    • ์ƒํƒœ๊ณต๊ฐ„ํŠธ๋ฆฌ : ์ฐพ๋Š” ํ•ด๋ฅผ ๋ฐ˜๋“œ์‹œ ํฌํ•จํ•˜๋Š” ํŠธ๋ฆฌ

      • ํ•ด๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด, ๋ฐ˜๋“œ์‹œ ํŠธ๋ฆฌ ๋‚ด๋ถ€์˜ ๋…ธ๋“œ๋กœ ์กด์žฌํ•œ๋‹ค๋Š” ๊ฒƒ. ํŠธ๋ฆฌ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋ฉด ํ•ด๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  • back tracking ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•

    • recursion ์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• : ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ณ  ๋ช…๋ฃŒํ•˜๋‹ค.

    • stack ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

ํ’€์ด

  • ์ƒํƒœ๊ณต๊ฐ„ํŠธ๋ฆฌ๋ฅผ ํ™œ์šฉํ•œ ๋ฐฑํŠธ๋ž˜ํ‚น ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ƒํƒœ๊ณต๊ฐ„ํŠธ๋ฆฌ ๋‚ด๋ถ€์— ๋ฐ˜๋“œ์‹œ ๋‹ต์ด ์กด์žฌํ•œ๋‹ค.

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

  • ์ ์šฉํ•  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ •๋ฆฌํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ๋ฆ„์„ ์ง€๋‹Œ๋‹ค.

    • ์œ„์˜ ์ƒํƒœ๊ณต๊ฐ„ํŠธ๋ฆฌ์—์„œ level ์„ ํ˜„์žฌ๋…ธ๋“œ, 1๋ฒˆ์—์„œ level ๊นŒ์ง€ ์–ด๋–ป๊ฒŒ ๋ง์ด ๋†“์˜€๋Š”์ง€๋Š” ๋ฐฐ์—ด๋กœ ํ‘œํ˜„ํ•œ๋‹ค๊ณ  ํ•ด๋ณด์ž.

      • cols[i] = j ์˜ ๊ฒฝ์šฐ, i๋ฒˆ์งธ ๋ง์ด j๋ฒˆ์งธ์— ๋†“์˜€๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

    • ์ถฉ๋Œ์˜ ์กฐ๊ฑด์„ ์ •์˜ํ•œ๋‹ค.

      • 1) ๊ฐ™์€ ๋…ธ๋“œ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์งˆ ๋•Œ

        • ์–ด์ฐจํ”ผ ๊ฐ ๋ ˆ๋ฒจ์—์„  ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋งŒ ๋†“์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ ˆ๋ฒจ ๋‚ด๋ถ€์—์„œ๋Š” ์ƒ๊ฐํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

        • ๊ฐ™์€ column ์— ์œ„์น˜ํ•  ๋•Œ = ๋…ธ๋“œ์˜ ๊ฐ’์ด ๊ฐ™๋‹ค.

      • 2) ๋Œ€๊ฐ์„  ์ƒ์—์„œ ๋งˆ์ฃผ์น ๋•Œ

        • ํ•˜๋‚˜์˜ ๋ฐฐ์—ด int[] a ์— a[level] = node ํ˜•ํƒœ๋กœ ์ €์žฅ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด, ์ด์ „ level ์ธ i์— ๋Œ€ํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ ์‹์ด ์„ฑ๋ฆฝํ•œ๋‹ค.

          • level - i = | a[i] - a[level] |

          • ๋‘ ๋…ธ๋“œ ์ค‘ ์–ด๋Š๊ฒƒ์ด ๋” ์•ž์„œ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ ˆ๋Œ€๊ฐ’์„ ๊ตฌํ•ด์•ผํ•œ๋‹ค.

    • ์ถฉ๋Œ์˜ ์กฐ๊ฑด์„ ํ†ต๊ณผํ•œ ๊ฒฝ์šฐ true, ํ†ต๊ณผ ๋ชปํ•œ ๊ฒฝ์šฐ false ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      • level = N ์ธ ๊ฒฝ์šฐ, ๋ชจ๋“  ๋ง์ด ๋†“์˜€๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ true ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ตœ์ข… ์„ฑ๊ณต!

    • ๊ทธ ์ด์™ธ์˜ ๊ฒฝ์šฐ๋Š” 1๋ถ€ํ„ฐ N๊นŒ์ง€ ์ˆœํšŒํ•˜๋ฉฐ level+1 ๋ฒˆ์งธ ํ–‰์— ๋ง์„ ๋†“์€ ๋’ค, ์œ„์˜ ์กฐ๊ฑด์„ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์œ„ํ•ด recursion ์„ ํ˜ธ์ถœํ•œ๋‹ค. recursion ์—์„œ true ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด, true ๋ฅผ, ์•„๋‹ ๊ฒฝ์šฐ, false ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

package practice.algorithm.recursion;

/**
 * N Queens
 * */
public class NQueens {
    private static final int N = 4;
    private static final int[] cols = new int[N+1];    //๋†“์ธ ๋ง์˜ ์œ„์น˜ ํ–‰๊ณผ ์—ด cols[i] = j

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

    private static boolean queens(int level) {
        if (!isPromising(level)) {
            return false;
        }

        if (level == N) {
            for (int i = 1; i <= N; i++) {
                System.out.println("(" +  i + ", " + cols[i] + ")");
            }
            return true;
        }

        for (int i = 1; i <= N; i++) {
            cols[level + 1] = i;
            if (queens(level+1)) {
                return true;
            }
        }
        return false;
    }

    private static boolean isPromising(int level) {
        for (int i = 1; i < level; i++) {
            if (cols[i] == cols[level]) {
                return false;
            }

            if (level - i == Math.abs(cols[i] - cols[level])) {
                return false;
            }
        }
        return true;
    }

    /**
     * (1, 2)
     * (2, 4)
     * (3, 1)
     * (4, 3)
     * */

}

Last updated