๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ’ป Computer Science/- Data Structure, Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜ PS] ๋ฐฑ์ค€ 15649๋ฒˆ N๊ณผ M (1) ์ž๋ฐ” ๋ฌธ์ œํ’€์ด

by Wonit 2021. 2. 18.

๋ฌธ์ œ

ํ•ด๋‹น ํฌ์ŠคํŒ…์€ ๋ฐฑ์ค€์˜ N๊ณผ M (1) ์˜ ์ ‘๊ทผ๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•œ ๊ธ€ ์ž…๋‹ˆ๋‹ค.
์ •๋‹ต ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์‹œ๋ ค๋ฉด solve url ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋จผ์ € ์ƒ๊ฐํ•ด๋ณด์ž.

๋ฌธ์ œ ์ ‘๊ทผ

 

์ด๋ฒˆ ๋ฌธ์ œ๋Š” ๋ฐฑํŠธ๋ž˜ํ‚น ๋ฌธ์ œ์˜ ๋Œ€ํ‘œ์ ์ธ ๋ฌธ์ œ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.


์ด์ „ ์‹œ๊ฐ„๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” ๋ธŒ๋ฃจํŠธ ํฌ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋“ค์„ ํ’€์—ˆ๋Š”๋ฐ, ๋ธŒ๋ฃจํŠธ ํฌ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋Œ€์ž…ํ•ด ์ •๋‹ต์„ ์ฐพ๋Š” ๋ฐฉ์‹์ด๋‹ค.


ํ•˜์ง€๋งŒ ์ด๋ฒˆ ๋ฌธ์ œ์—์„œ ๋ธŒ๋ฃจํŠธ ํฌ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋‹Œ ๋ฐฑ ํŠธ๋ž˜ํ‚น ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋”์šฑ ์ž˜ ์–ด์šธ๋ ค ๋ณด์ธ๋‹ค.

Back-Tracking ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ฐฑํŠธ๋ž˜ํ‚น์€ ๋…ธ๋“œ์˜ ์œ ๋ง์„ฑ์„ ํŒ๋‹จํ•œ๋‹ค.


์—ฌ๊ธฐ์„œ ๋…ธ๋“œ์˜ ์œ ๋ง์„ฑ์ด๋ผ๊ณ  ํ•จ์€ ์‰ฝ๊ฒŒ ๊ฐ€์ง€์น˜๊ธฐ๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋ฉฐ ํ”ํ•œ ์˜ˆ๋กœ dfs์—์„œ ๋ฐฉ๋ฌธ ํ–ˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” boolean[] check ์— ํ•ด๋‹นํ•œ๋‹ค.


์—ฌ๊ธฐ์„œ ๋…ธ๋“œ์˜ ์œ ๋ง์„ฑ์„ ํ™•์ธํ•˜๊ณ  ๋งŒ์•ฝ ์œ ๋งํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ผ๋ฉด ํ•ด๋‹น ํƒ์ƒ‰์€ ๋” ๊นŠ๊ฒŒ ๋“ค์–ด๊ฐ€์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ํƒ์ƒ‰์œผ๋กœ ์ง„ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

 

์ด ๋ฐฉ๋ฒ•์ด ๋ฐ”๋กœ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋‹ค ์‹œ๋„ํ•˜๋Š” ๋ธŒ๋ฃจํŠธ ํฌ์Šค์™€ ๋‹ค๋ฅธ์ ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ํ•ด๋‹น ๋ฌธ์ œ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ ์„ ์ด์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•ด๊ฒฐ๋ฒ•

์šฐ์„  ๋ฌธ์ œ์—์„œ ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ง์„ ์ฐพ์•„๋ณด์ž.

1~N ๊นŒ์ง€ ์ˆ˜๋ฅผ ์ค‘๋ณต ์—†์ด M๊ฐœ ๋ฝ‘์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜

์˜ˆ๋ฅผ ๋“ค์–ด N๊ณผ M์ด ๊ฐ๊ฐ 3์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

๊ทธ๋Ÿผ ์œ„์™€ ๊ฐ™์ด ์ค‘๋ณต์ด ์—†๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํŠธ๋ฆฌ์™€ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

 

์—ฌ๊ธฐ์— ๋ฐฑํŠธ๋ž˜ํ‚น ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•ด๋ณด์ž.

 

๋…ธ๋“œ์˜ ์œ ๋ง์„ฑ์€ ๋ฌด์—‡์ผ๊นŒ?

๊ทธ๋ ‡๋‹ค ๋ฐ”๋กœ ์ค‘๋ณต์ด ์•„๋‹Œ ๋…ธ๋“œ๊ฐ€ ๋…ธ๋“œ์˜ ์œ ๋ง์„ฑ์ด ๋œ๋‹ค.

์šฐ๋ฆฌ๋Š” ์œ ๋ง์„ฑ์„ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•œ boolean[] check ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ  ํƒ์ƒ‰ ๊ณผ์ •์—์„œ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋‹ด์„ int[] arr๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ด์šฉํ•  ๊ฒƒ์ด๋‹ค.

 

์ด ๋ฌธ์ œ๋Š” dfs๋กœ ํ•ด๊ฒฐํ•  ๊ฒƒ์ด๋ฉฐ, N๊ณผ M์„ ๋ฐ›๋Š” ๋ณ€์ˆ˜์™€ Index ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ์žฌ๊ท€๊ฐ€ ๊นŠ์–ด์งˆ ๋•Œ ๋งˆ๋‹ค 1์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  Index ๋ณ€์ˆ˜๊ฐ€ m๊ณผ ๊ฐ™์•„์ง„๋‹ค๋ฉด ํ˜ธ์ถœ์„ ๋๋‚ด๊ณ  ํƒ์ƒ‰ ๊ณผ์ •์—์„œ ์ €์žฅํ•œ arr ๊ฐ’์„ ์ถœ๋ ฅํ•˜์—ฌ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉด ๋œ๋‹ค.

์˜ค๋‹ต ํ›„๋ณด

๋งŒ์•ฝ check[i] ์˜ ๊ฐ’์„ ๋‹ค์‹œ false๋กœ ์ง€์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ dfs๊ฐ€ ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

 

์ฆ‰ ์ฒ˜์Œ ์‹คํ–‰ํ•œ dfs๋งŒ ์ถœ๋ ฅ์ด ๋  ๊ฒƒ์ด๋‹ค.

 

์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ dfsํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋…ธ๋“œ๋กœ ์‹œ์ž‘ํ•œ dfs์˜ ํƒ์ƒ‰์ด ๋๋‚œ๋‹ค๋ฉด ๋‹ค๋ฅธ ๋…ธ๋“œ๋„ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก false๋กœ ์ดˆ๊ธฐํ™” ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

์ •๋‹ต ์ฝ”๋“œ

public class Main {
    static boolean[] check = new boolean[10];
    static int[] graph = new int[10];
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        int n = input.nextInt();
        int m = input.nextInt();

        dfs(0, n, m);
    }

    private static void dfs(int index, int n, int m) {
    
        if(index == m) {
        
            for(int value : graph) {
            
                if(value != 0) System.out.print(value + " ");
            }
            
            System.out.println();
            
            return ;
            
        }

        for (int i = 1; i <= n; i++) {
        
            if(check[i]) continue;
            
            check[i] = true;
            
            graph[index] = i;
            
            dfs(index + 1, n, m);
            
            check[i] = false;
        }
    }
}

์ •๋‹ต ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์‹œ๋ ค๋ฉด solve url ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€