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

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

by Wonit 2021. 2. 18.

๋ฌธ์ œ

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

 

15650๋ฒˆ: N๊ณผ M (2)

ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ๋ฌธ์ œ์˜ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ˆ˜์—ด์„ ์ถœ๋ ฅํ•œ๋‹ค. ์ค‘๋ณต๋˜๋Š” ์ˆ˜์—ด์„ ์—ฌ๋Ÿฌ ๋ฒˆ ์ถœ๋ ฅํ•˜๋ฉด ์•ˆ๋˜๋ฉฐ, ๊ฐ ์ˆ˜์—ด์€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. ์ˆ˜์—ด์€ ์‚ฌ์ „ ์ˆœ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ์„œ๋กœ ์ถœ๋ ฅํ•ด

www.acmicpc.net

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

๋ฌธ์ œ ์ ‘๊ทผ

์ด๋ฒˆ ๋ฌธ์ œ๋Š” ์ง€๋‚œ N๊ณผ M (1) ํ’€์ด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐฑํŠธ๋ž˜ํ‚น ๋ฌธ์ œ์˜ ๋Œ€ํ‘œ์ ์ธ ๋ฌธ์ œ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.


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


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

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

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


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


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

 

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

 

์ง€๋‚œ N๊ณผ M (1) ํ’€์ด์—์„œ๋Š” ์ค‘๋ณต์ด ์—†๋Š” ์ˆ˜๋ฅผ ์œ„ํ•ด์„œ ์œ ๋ง ์กฐ๊ฑด์„ check[i] == false ์ธ ๊ฐ’๋งŒ ํƒ์ƒ‰ํ•˜๋„๋ก ํ–ˆ๋Š”๋ฐ, ์ด๋ฒˆ ๋ฌธ์ œ์—์„œ๋Š” ํ•œ ๊ฐ€์ง€๋ฅผ ๋” ํ•ด์•ผ ํ•œ๋‹ค.

๊ณ ๋ฅธ ์ˆ˜์—ด์ด ์˜ค๋ฆ„์ฐจ์ˆœ์ด์–ด์•ผ ํ•œ๋‹ค.

๋‹ค์Œ ๋‘ ์ˆ˜๋ฅผ ๋ด๋ณด์ž.

  • 1 3 2 4
  • 1 2 3 4

์—ฌ๊ธฐ์„œ 1 3 2 4๋Š” ์ˆ˜์—ด ์ž์ฒด๊ฐ€ ์˜ค๋ฆ„ ์ฐจ์ˆœ์ด ์•„๋‹ˆ๋ฏ€๋กœ ํƒˆ๋ฝํ•˜๊ฒŒ ๋œ๋‹ค.

 

์ด๊ฑธ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ• ๊นŒ?

ํ•ด๊ฒฐ๋ฒ•

์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์„œ ์œ ๋ง ์กฐ๊ฑด์„ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€ํ•  ๊ฒƒ์ธ๋ฐ, ๋ฐ”๋กœ ์ง€๋‚œ๋ฒˆ ์‚ฌ์šฉํ•œ ์ธ๋ฑ์Šค ๊ฐ’์ด ํ˜„์žฌ ๊ฐ’๋ณด๋‹ค ์ž‘์„ ๊ฒฝ์šฐ ๊ฐ€์ง€์น˜๊ธฐ๋ฅผ ํ•  ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ง€๋‚œ๋ฒˆ ์‚ฌ์šฉํ•œ ์ธ๋ฑ์Šค ๊ฐ’์„ ์•Œ๋ ค์ค„ ๋งค๊ฐœ๋ณ€์ˆ˜ ํ•˜๋‚˜๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•œ๋‹ค.

dfs(int index, int n, int m, int before);

before = result[index];

 

์ •๋‹ต ์ฝ”๋“œ

private static void dfs(int index, int n, int m, int before) {
    if(index == m) {
        for (int i = 0; i < 8; i++) {
            if(result[i] != 0) {
                System.out.print(result[i] + " ");
            }
        }
        System.out.println();
        return;
    }

    for (int i = 1; i <= n; i++) {
        if(check[i] || i < before) continue; // ์œ ๋ง์„ฑ ํŒ๋‹จ ์กฐ๊ฑด 1, 2
        check[i] = true;
        result[index] = i;
        dfs(index + 1, n, m, result[index]);
        check[i] = false;
    }
}

๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ dfs๋Š” ์ด๋ ‡๋‹ค.


ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ ๋” ํšจ์œจ์ ์œผ๋กœ ์ตœ์ ํ™” ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

๋‹ค์Œ ์ธ๋ฑ์Šค๋ฅผ ์ฑ„์šฐ๊ธฐ ์œ„ํ•œ for๋ฌธ์„ ๋ณด๋ฉด, i๊ฐ€ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ์œ ๋ง์„ฑ ํŒ๋‹จ ์กฐ๊ฑด 1, 2๋ฅผ ๊ฑฐ์น˜๊ฒŒ ํ•  ๊ฒŒ ์•„๋‹ˆ๋ผ ์• ์ดˆ์— ์œ ๋ง์„ฑ ํŒ๋‹จ ์กฐ๊ฑด 2๋ฒˆ์„ ๋งŒ์กฑํ•˜๋Š” ์ˆ˜๋งŒ ์ฑ„์šฐ๋ฉด ์กฐ๊ฑด ํ•˜๋‚˜๋ฅผ ๋œ ์‚ฌ์šฉํ•˜๊ณ  ๊ทธ๋งŒํผ ์‹œ๊ฐ„๋„ ์ตœ์ ํ™”๋  ์ˆ˜ ์žˆ๋‹ค.

 

private static void dfs(int index, int n, int m, int before) {
    if(index == m) {
        for (int i = 0; i < 8; i++) {
            if(result[i] != 0) {
                System.out.print(result[i] + " ");
            }
        }
        System.out.println();
        return;
    }

    for (int i = before; i <= n; i++) { // ์•„์˜ˆ ์‹œ์ž‘์„ ์œ ๋งํ•œ ๋…ธ๋“œ๋“ค๋ถ€ํ„ฐ ํ•ด๋ฒ„๋ฆฌ๋ฉด ๋จ
        if(check[i]) continue; // ์œ ๋ง์„ฑ ํŒ๋‹จ ์กฐ๊ฑด 1
        check[i] = true;
        result[index] = i;
        dfs(index + 1, n, m, result[index]);
        check[i] = false;
    }
}

๊ทธ๋Ÿผ ์‹œ๊ฐ„์„ ์กฐ๊ธˆ ๋” ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

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

๋Œ“๊ธ€