[๋ฐฑ์ค€] N-Queen ๐Ÿ‘‘ (Java)

hoonssacยท2024๋…„ 9์›” 24์ผ

Coding test

๋ชฉ๋ก ๋ณด๊ธฐ
1/9

โณ๋ฌธ์ œ

N-Queen ๋ฌธ์ œ๋Š” ํฌ๊ธฐ๊ฐ€ N ร— N์ธ ์ฒด์ŠคํŒ ์œ„์— ํ€ธ N๊ฐœ๋ฅผ ์„œ๋กœ ๊ณต๊ฒฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋†“๋Š” ๋ฌธ์ œ์ด๋‹ค.

N์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ํ€ธ์„ ๋†“๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N์ด ์ฃผ์–ด์ง„๋‹ค. (1 โ‰ค N < 15)

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ํ€ธ N๊ฐœ๋ฅผ ์„œ๋กœ ๊ณต๊ฒฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋†“๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์˜ˆ์ œ ์ž…๋ ฅ

8

์˜ˆ์ œ ์ถœ๋ ฅ

92

โœ๏ธํ’€์ด

์ด ๋ฌธ์ œ๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ฐฑํŠธ๋ž˜ํ‚น(BackTracking)๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
๋ฌธ์ œ ์ดํ•ด๋ฅผ ์œ„ํ•ด ์กฐ๊ธˆ ๋” ์„ค๋ช…ํ•˜์ž๋ฉด,
ํ€ธ์€ ์ฒด์Šค์—์„œ ๊ฐ™์€ ํ–‰, ์—ด, ๋˜๋Š” ๋Œ€๊ฐ์„  ์œ„์— ์žˆ๋Š” ๋ง์„ ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, 8 x 8 ์ฒด์ŠคํŒ์ด ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค๋ฉด, ์ด ๋ฌธ์ œ์˜ solution ์ค‘ ํ•œ ๊ฐ€์ง€๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ๊ทœ์น™์— ์˜ํ•ด ๋ฐฐ์น˜๋œ 8๊ฐœ์˜ ํ€ธ์€ ์„œ๋กœ ๊ณต๊ฒฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ํ•˜๋‚˜๋„ ์—†์Šต๋‹ˆ๋‹ค.
์ด ๋ฌธ์ œ๋Š” ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋ชจ๋‘ ๊ตฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ DFS๋ฅผ ์‚ฌ์šฉํ•ด ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ ๋ คํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด N์ด 4์ธ ๊ฒฝ์šฐ, 0๋ฒˆ ํ–‰์— ๋†“๋Š” ํ€ธ์˜ ์œ„์น˜๋Š” ์ด๋ ‡๊ฒŒ 4๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์ฒซ ๋ฒˆ์งธ๋ฅผ ๊ฑฐ์ณ ๋‘ ๋ฒˆ์งธ ๊ฒฝ์šฐ์—์„œ DFS ํƒ์ƒ‰์„ ํ•˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด, 1๋ฒˆ ํ–‰์— ํ€ธ์„ ๋ฐฐ์น˜ํ•˜๋Š” 4๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜๋กœ ๋ถ„๊ธฐ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ, ์ฒซ ๋ฒˆ์งธ ~ ์„ธ ๋ฒˆ์งธ ๊ฒฝ์šฐ์—๋Š” ๊ทธ ์ „ ํ–‰์— ๋ฐฐ์น˜์‹œ์ผœ ๋†“์•˜๋˜ ํ€ธ์—๊ฒŒ ๊ณต๊ฒฉ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ๋“ค์€ ์ ˆ๋Œ€ solution์ด ๋  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ด์ƒ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๋„ค ๋ฒˆ์งธ ๊ฒฝ์šฐ์—๋งŒ ๊ณ„์†ํ•ด์„œ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์ฃผ์š” ๋ณ€์ˆ˜

static int[] arr;
static int sum;

arr ๋ฐฐ์—ด์€ ๊ฐ ํ–‰์— ํ€ธ์ด ๋†“์ธ ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, arr[0]์€ ์ฒซ ๋ฒˆ์งธ ํ–‰์— ํ€ธ์ด ๋†“์ธ ์—ด์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
sum ๋ณ€์ˆ˜๋Š” ํ€ธ์„ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ์„ธ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”์ธ ๋ฉ”์„œ๋“œ

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
    
        int n = sc.nextInt();
        arr = new int[n];
        dfs(0, n);
        System.out.println(sum);

        sc.close();
    }

Scanner๋ฅผ ํ†ตํ•ด n์„ ์ž…๋ ฅ๋ฐ›๊ณ , ํ•ด๋‹น ํฌ๊ธฐ ๋งŒํผ arr ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ด ์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  dfs ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•˜๋Š”๋ฐ, ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ˜„์žฌ ํ–‰๊ณผ ์ฒด์ŠคํŒ์˜ ํฌ๊ธฐ n์„ ๋ณด๋‚ด์ฃผ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

DFS ๋ฉ”์„œ๋“œ

	public static void dfs(int start, int n) {
		// ์ข…๋ฃŒ ์กฐ๊ฑด : ๋ชจ๋“  ํ–‰์— ํ€ธ์„ ์„ฑ๊ณต์ ์œผ๋กœ ๋ฐฐ์น˜ํ–ˆ๋‹ค๋ฉด
		if (start == n) {
			sum += 1;
			return;
		}
		
		for (int i = 0; i < n; i++) {
			boolean check = true; // ํ˜„์žฌ ์—ด์— ํ€ธ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ์ง€์— ๋Œ€ํ•œ ์—ฌ๋ถ€
			for (int j = 0; j < start; j++) {
				// ๊ฐ™์€ ์—ด์— ํ€ธ์ด ์žˆ๋Š” ์ง€
				// ์™ผ์ชฝ ๋ฐฉํ–ฅ ๋Œ€๊ฐ์„ ์— ํ€ธ์ด ์žˆ๋Š” ์ง€
				// ์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅ ๋Œ€๊ฐ์„ ์— ํ€ธ์ด ์žˆ๋Š” ์ง€
				if (arr[j] == i || arr[j] + (start - j) == i || arr[j] - (start - j) == i) {
					check = false;
					break;
				}
			}
			
			if (check) {
				arr[start] = i;
				dfs(start + 1, n);
			}
		}
	}

์šฐ์„ , ์ข…๋ฃŒ ์กฐ๊ฑด์„ ๋จผ์ € ์„ธ์›Œ ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
ํƒ์ƒ‰์ด ์ข…๋ฃŒ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์€ nํ–‰๊นŒ์ง€ ํƒ์ƒ‰์„ ํ–ˆ๋‹ค๋Š” ์˜๋ฏธ์ด๊ณ , nํ–‰๊นŒ์ง€ ํƒ์ƒ‰์„ ํ–ˆ๋‹ค๋Š” ์˜๋ฏธ๋Š” solution(ํ€ธ์„ ๊ณต๊ฒฉ๋ฐ›์ง€ ์•Š๋Š” ์œ„์น˜์— ๋ชจ๋‘ ๋ฐฐ์น˜ํ•œ ๊ฒฝ์šฐ)์„ ๋ฐœ๊ฒฌํ•œ ๊ฒฝ์šฐ์ด๊ธฐ ๋•Œ๋ฌธ์—, sum์— 1์„ ๋”ํ•˜๊ณ  ํƒ์ƒ‰์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

์ข…๋ฃŒ ์กฐ๊ฑด์„ ์„ธ์› ์œผ๋‹ˆ ์ด์ œ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์šฐ์„ , ํ˜„์žฌ ํ–‰(start)์—์„œ ํ€ธ์„ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ์ด n๊ฐ€์ง€ ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ , ํ˜„์žฌ ํ–‰(start)๋ณด๋‹ค ์•ž์— ๋ฐฐ์น˜ํ–ˆ๋˜ ํ€ธ๋“ค์˜ ์œ„์น˜๋ฅผ ํŒŒ์•…ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•ด ์ด์ „ ํ–‰์— ๋Œ€ํ•œ ์œ„์น˜ j๋ฅผ ์„ค์ •ํ•ด ์ค๋‹ˆ๋‹ค.

์ด์ œ 3๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋”ฐ์ ธ์„œ ํ˜„์žฌ ์œ„์น˜์— ํ€ธ์„ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ง€ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • arr[j] == i : ๊ฐ™์€ ์—ด์— ํ€ธ์ด ์žˆ๋Š” ์ง€ ํ™•์ธ
  • arr[j] + (start - j) == i : ์™ผ์ชฝ ๋Œ€๊ฐ์„ ์œผ๋กœ๋ถ€ํ„ฐ ๊ณต๊ฒฉ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ง€ ํ™•์ธ
  • arr[j] - (start - j) == i : ์˜ค๋ฅธ์ชฝ ๋Œ€๊ฐ์„ ์œผ๋กœ๋ถ€ํ„ฐ ๊ณต๊ฒฉ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ง€ ํ™•์ธ

์ด ์„ธ ๊ฐ€์ง€ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ฐธ์ด๋ฉด, ํ•ด๋‹น ์œ„์น˜์—๋Š” ํ€ธ์„ ๋†“์„ ์ˆ˜ ์—†๊ณ , ๋ชจ๋‘ ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ํ•ด๋‹น ์œ„์น˜์— ํ€ธ์„ ๋†“์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, arr๋ฐฐ์—ด์— ํ•ด๋‹น ์—ด์˜ ์œ„์น˜ i๋ฅผ ์ €์žฅํ•˜๊ณ , ์žฌ๊ท€๋ฅผ ํ†ตํ•ด ํƒ์ƒ‰์„ ์ด์–ด๋‚˜๋„๋ก ํ•ด ์ค๋‹ˆ๋‹ค.

์ตœ์ข…์ ์œผ๋กœ start๊ฐ€ n๊นŒ์ง€ ๋‹ค๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ sum์— ์ €์žฅ๋˜๊ณ , ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” solution์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ‘พ์ „์ฒด ์ฝ”๋“œ

import java.util.*;

public class SWEA_2806 {
	static int[] arr; // ๊ฐ ํ–‰์— ํ€ธ์ด ๋†“์ธ ์—ด์˜ ์ธ๋ฑ์Šค ์ €์žฅ
	static int sum; // ํ€ธ์„ ๋ฐฐ์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜
	
	public static void dfs(int start, int n) {
		// ์ข…๋ฃŒ ์กฐ๊ฑด : ๋ชจ๋“  ํ–‰์— ํ€ธ์„ ์„ฑ๊ณต์ ์œผ๋กœ ๋ฐฐ์น˜ํ–ˆ๋‹ค๋ฉด
		if (start == n) {
			sum += 1;
			return;
		}
		
		for (int i = 0; i < n; i++) {
			boolean check = true; // ํ˜„์žฌ ์—ด์— ํ€ธ์„ ๋†“์„ ์ˆ˜ ์žˆ๋Š” ์ง€์— ๋Œ€ํ•œ ์—ฌ๋ถ€
			for (int j = 0; j < start; j++) {
				// ๊ฐ™์€ ์—ด์— ํ€ธ์ด ์žˆ๋Š” ์ง€
				// ์™ผ์ชฝ ๋ฐฉํ–ฅ ๋Œ€๊ฐ์„ ์— ํ€ธ์ด ์žˆ๋Š” ์ง€
				// ์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅ ๋Œ€๊ฐ์„ ์— ํ€ธ์ด ์žˆ๋Š” ์ง€
				if (arr[j] == i || arr[j] + (start - j) == i || arr[j] - (start - j) == i) {
					check = false;
					break;
				}
			}
			
			if (check) {
				arr[start] = i;
				dfs(start + 1, n);
			}
		}
	}
	
	public static void main(String args[]) throws Exception
	{
		Scanner sc = new Scanner(System.in);
		int T;
		T=sc.nextInt();

		for(int test_case = 1; test_case <= T; test_case++)
		{
			int n = sc.nextInt();
			sum = 0;
			arr = new int[n];
			
			dfs(0,n);
			System.out.println("#" + test_case + " " + sum);

		}
		sc.close();
	}
}

๐Ÿ”—๋ฌธ์ œ ๋งํฌ
๐Ÿ’ปRepository

profile
ํ›ˆ์‹น์˜ ๊ฐœ๋ฐœ์—ฌํ–‰

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