[Boj_17244] ์•„๋งž๋‹ค์šฐ์‚ฐ

๐Ÿ“Ž ๋ฌธ์ œ ๋งํฌ

https://www.acmicpc.net/problem/17244

 

โ–ธ ๋ฌธ์ œ

๊ฒฝ์žฌ์”จ๋Š” ์ €๋… ์•ฝ์†์„ ๊ฐ€๊ธฐ ์ „ ์ฑ™๊ธฐ์ง€ ์•Š์€ ๋ฌผ๊ฑด๋“ค์ด ์žˆ๋Š” ์ง€ ํ™•์ธํ•˜๊ณ  ์žˆ๋‹ค. ํ•„์š”ํ•œ ๋ฌผ๊ฑด์€ ์ „๋ถ€ ์ฑ™๊ธด ๊ฒƒ ๊ฐ™์•˜๊ณ  ์™ธ์ถœ ํ›„ ๋Œ์•„์˜ค๋Š” ๊ธธ์— ๊ฒฝ์žฌ์”จ๋Š” ์™ธ์ณค๋‹ค.

"์•„ ๋งž๋‹ค ์šฐ์‚ฐ!!!"

๊ฒฝ์žฌ ์”จ๋Š” ๋งค๋ฒˆ ์™ธ์ถœํ•˜๊ณ  ๋‚˜์„œ์•ผ ์–ด๋–ค ๋ฌผ๊ฑด์„ ์ง‘์— ๋†“๊ณ  ์™”๋‹ค๋Š” ๊ฒƒ์„ ๋– ์˜ฌ๋ฆด ๋•Œ๋งˆ๋‹ค ์ž์ฑ…๊ฐ์— ์‹œ๋‹ฌ๋ฆฌ๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ์‹ซ์—ˆ๋‹ค.

์™ธ์ถœ์ด ์žฆ์€ ๊ฒฝ์žฌ ์”จ๋Š” ๋ฐ˜๋ณต๋˜๋Š” ์ผ์„ ๊ทผ์ ˆํ•˜๊ธฐ ์œ„ํ•ด ๊ผญ ์ฑ™๊ฒจ์•ผ ํ•  ๋ฌผ๊ฑด๋“ค์„ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค. ํ•˜์ง€๋งŒ ์ง€๊ฐ‘, ์Šค๋งˆํŠธํฐ, ์šฐ์‚ฐ, ์ฐจ ํ‚ค, ์ด์–ดํฐ, ์‹œ๊ณ„, ๋ณด์กฐ ๋ฐฐํ„ฐ๋ฆฌ ๋“ฑ ์ข…๋ฅ˜์™€ ๊ฐœ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์•˜๋‹ค.

ํ‰์†Œ ๋ถˆํ•„์š”ํ•œ ์›€์ง์ž„์„ ์•„์ฃผ ์‹ซ์–ดํ•˜๋Š” ๊ฒฝ์žฌ ์”จ๋Š” ์ด ๋ฌผ๊ฑด๋“ค์„ ์ตœ๋Œ€ํ•œ ๋น ๋ฅด๊ฒŒ ์ฑ™๊ฒจ์„œ ์™ธ์ถœํ•˜๋Š” ์ด๋™ ๊ฒฝ๋กœ๋ฅผ ์•Œ๊ณ  ์‹ถ์—ˆ๋‹ค.

๊ฒฝ์žฌ ์”จ๋Š” ํ•œ ๊ฑธ์Œ์— ์ƒํ•˜์ขŒ์šฐ์— ์ธ์ ‘ํ•œ ์นธ์œผ๋กœ๋งŒ ์›€์ง์ผ ์ˆ˜ ์žˆ๋‹ค.

๊ฒฝ์žฌ ์”จ๋ฅผ ์œ„ํ•ด ์ง‘์„ ์œ„์—์„œ ๋ฐ”๋ผ๋ณธ ๋ชจ์Šต๊ณผ ์ฑ™๊ฒจ์•ผ ํ•  ๋ฌผ๊ฑด๋“ค์˜ ์œ„์น˜๋“ค์„ ์•Œ๊ณ  ์žˆ์„ ๋•Œ, ๋ฌผ๊ฑด์„ ๋ชจ๋‘ ์ฑ™๊ฒจ์„œ ์™ธ์ถœํ•˜๊ธฐ๊นŒ์ง€ ์ตœ์†Œ ๋ช‡ ๊ฑธ์Œ์ด ํ•„์š”ํ•œ์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์ž.

 

โ–ธ ์ž…๋ ฅ

์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ์ง‘์˜ ๊ฐ€๋กœ ๊ธธ์ด N๊ณผ ์„ธ๋กœ ๊ธธ์ด M์ด ์ž…๋ ฅ๋œ๋‹ค. (3 ≤ N, M ≤ 50)

๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ๋Š” ์ง‘์˜ ๊ตฌ์กฐ๊ฐ€ ์˜ˆ์ œ ์ž…๋ ฅ๊ณผ ๊ฐ™์ด ์ฃผ์–ด์ง„๋‹ค.

๋น„์–ด์žˆ๋Š” ๊ณณ์€ '.'๋กœ ๋ฒฝ์€ '#'๋กœ ์ž…๋ ฅ๋œ๋‹ค. ๊ฒฝ์žฌ ์”จ์˜ ํ˜„์žฌ ์œ„์น˜๋Š” S, ๋‚˜๊ฐ€๋Š” ๋ฌธ์˜ ์œ„์น˜๋Š” E, ์ฑ™๊ฒจ์•ผ ํ•˜๋Š” ๋ฌผ๊ฑด์€ ์ข…๋ฅ˜์— ์ƒ๊ด€์—†์ด X๋กœ ์ž…๋ ฅ๋œ๋‹ค.

์ฑ™๊ฒจ์•ผ ํ•˜๋Š” ๋ฌผ๊ฑด์€ ์ตœ๋Œ€ 5๊ฐœ๊นŒ์ง€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ง‘์€ ์–ธ์ œ๋‚˜ ๋ฒฝ์œผ๋กœ ๋‘˜๋Ÿฌ์‹ธ์—ฌ ์žˆ๊ณ , ๋‚˜๊ฐ€๋Š” ๋ฌธ์€ ์–ธ์ œ๋‚˜ ํ•˜๋‚˜์ด๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

S์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋ชจ๋“  ๋ฌผ๊ฑด์„ ์ฑ™๊ฒจ์„œ E๊นŒ์ง€ ๋„์ฐฉํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋ชจ๋“  ๋ฌผ๊ฑด์„ ์ฑ™๊ธธ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋Š” ์ฃผ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.

 

๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด

  • ๐Ÿฅ‡  ๋ฌธ์ œ ๋ ˆ๋ฒจ : ๊ณจ๋“œ 2
  • ๐Ÿ””  ๋ฌธ์ œ ์œ ํ˜• : ๊ทธ๋ž˜ํ”„ ์ด๋ก , ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰, ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰, ๋น„ํŠธ๋งˆ์Šคํ‚น
  • ๐Ÿ’ฌ  ํ’€์ด ์–ธ์–ด : JAVA

 

๐Ÿค” ๋ฌธ์ œ ํ’€์ด

์•„์ดํ…œ์€ ์ตœ๋Œ€ 5๊ฐœ๊นŒ์ง€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, 2โต = 32๊ฐ€์ง€ ์กฐํ•ฉ์€ intํ˜•์œผ๋กœ ์ถฉ๋ถ„ํžˆ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ๊ฒฝ์žฌ ์”จ๊ฐ€ ์–ด๋–ค ์•„์ดํ…œ์„ ์ฑ™๊ฒผ๋Š”์ง€๋ฅผ ๋น„ํŠธ๋งˆ์Šคํฌ๋กœ ํ‘œํ˜„ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.

 

์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ, 'X'๋กœ ํ‘œ์‹œ๋œ ์•„์ดํ…œ๋งˆ๋‹ค 0๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฒˆํ˜ธ๋ฅผ ๋ถ€์—ฌํ–ˆ๋‹ค.

์˜ˆ์ œ ์ž…๋ ฅ1์„ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์ด ๋ฒˆํ˜ธ๋“ค์€ ๋น„ํŠธ๋งˆ์Šคํฌ์˜ ๊ฐ ์ž๋ฆฟ์ˆ˜๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ์™ผ์ชฝ ์‹œํ”„ํŠธ ์—ฐ์‚ฐ (1 << n)์„ ํ†ตํ•ด ๋น„ํŠธ์ƒ์—์„œ ํ•ด๋‹น ์•„์ดํ…œ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์•„์ดํ…œ์„ ํ•˜๋‚˜๋„ ์ฑ™๊ธฐ์ง€ ์•Š์€ ์ƒํƒœ๋ถ€ํ„ฐ ๋ชจ๋“  ์•„์ดํ…œ์„ ์ฑ™๊ธด ์ƒํƒœ๊นŒ์ง€์˜ ๋ชจ๋“  ์กฐํ•ฉ์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.
์ด๋•Œ, ๋ชจ๋“  ์•„์ดํ…œ์„ ๋‹ค ์ฑ™๊ธด ์ƒํƒœ๋Š” ์ „์ฒด ์ง‘ํ•ฉ(๊ณต์ง‘ํ•ฉ ์ œ์™ธ)์„ ์˜๋ฏธํ•˜๋ฏ€๋กœ int checkNum = (1 << itemCnt) - 1๋กœ ์„ค์ •ํ•œ๋‹ค.

์ด ๊ฐ’์€ ํƒ์ƒ‰ ์ค‘ ๋ชจ๋“  ์•„์ดํ…œ์„ ์ˆ˜์ง‘ํ–ˆ๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ๊ธฐ์ค€์ด ๋œ๋‹ค.

 

ํƒ์ƒ‰ ์ค‘ ์•„์ดํ…œ์„ ๋ฐœ๊ฒฌํ•  ๊ฒฝ์šฐ, ํ˜„์žฌ ์•„์ดํ…œ ์ƒํƒœ์— OR ๋น„ํŠธ ์—ฐ์‚ฐ |์„ ์‚ฌ์šฉํ•ด ์ƒˆ๋กœ์šด ์•„์ดํ…œ์„ ๋ˆ„์ ํ•œ๋‹ค.

๊ฒฝ์žฌ ์”จ๊ฐ€ 0๋ฒˆ ์•„์ดํ…œ์„ ์†Œ์œ ํ•˜๊ณ  ์žˆ๊ณ , 2๋ฒˆ ์•„์ดํ…œ์„ ๋ฐœ๊ฒฌํ–ˆ์„ ๋•Œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

๊ฒฝ์žฌ ์”จ๊ฐ€ ๋ชจ๋“  ์•„์ดํ…œ์„ ์ฑ™๊ธฐ๊ณ  ์ตœ์†Œ ์‹œ๊ฐ„ ๋‚ด์— ์™ธ์ถœํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰(BFS)์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

์ด๋•Œ ๊ฐ™์€ ์œ„์น˜๋ผ๋„ ํ˜„์žฌ๊นŒ์ง€ ์ฑ™๊ธด ์•„์ดํ…œ์˜ ์กฐํ•ฉ์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‹จ์ˆœํžˆ ์œ„์น˜๋งŒ์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ฉด ์•ˆ ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๊ฒฝ์žฌ ์”จ๊ฐ€ 1๋ฒˆ ์•„์ดํ…œ์„ ์ฑ™๊ธด ๋’ค ๋‹ค์‹œ ์›๋ž˜ ์™”๋˜ ๊ธธ์„ ๋˜๋Œ์•„๊ฐ€์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž.

๋งŒ์•ฝ 2์ฐจ์› ๋ฐฐ์—ด๋กœ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค๋ฉด, ์ด๋ฏธ ํ•œ ๋ฒˆ ๊ฐ”๋˜ ๊ธธ์€ ๋‹ค์‹œ ๊ฐˆ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ž˜์„œ ์œ„์น˜๋ฟ ์•„๋‹ˆ๋ผ ์•„์ดํ…œ ์ƒํƒœ๋„ ํ•จ๊ป˜ ๊ณ ๋ คํ•œ 3์ฐจ์› ๋ฐฉ๋ฌธ ๋ฐฐ์—ด checked = new boolean[m][n][checkNum+1]์ด ํ•„์š”ํ•˜๋‹ค.

์—ฌ๊ธฐ์„œ checkNum + 1๋กœ ์„ค์ •ํ•œ ์ด์œ ๋Š”, checkNum์€ ๊ฐ€๋Šฅํ•œ ์•„์ดํ…œ ์ƒํƒœ ์ค‘ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๊ฐ’์„ ์˜๋ฏธํ•˜๊ณ , 0๋ถ€ํ„ฐ checkNum๊นŒ์ง€์˜ ๋ชจ๋“  ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋ ค๋ฉด ์ด checkNum + 1๊ฐœ์˜ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด ๋ฐฐ์—ด์€ ๊ฒฝ์žฌ ์”จ๊ฐ€ (x, y) ์œ„์น˜์— ์–ด๋–ค ์•„์ดํ…œ ์ƒํƒœ๋กœ ๋„๋‹ฌํ–ˆ๋Š”์ง€๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

 

BFS ํƒ์ƒ‰ ์ค‘ ์ถœ๊ตฌ 'E'์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ, ํ˜„์žฌ ์•„์ดํ…œ ์ƒํƒœ๊ฐ€ checkNum๊ณผ ๊ฐ™๋‹ค๋ฉด ๋ชจ๋“  ๋ฌผ๊ฑด์„ ์ฑ™๊ธด ์ƒํƒœ๋กœ ์™ธ์ถœ์— ์„ฑ๊ณตํ•œ ๊ฒƒ์ด๋ฏ€๋กœ, ๊ทธ๋•Œ๊นŒ์ง€ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์ถœ๋ ฅํ•œ๋‹ค.

 

์œ„ ํ’€์ด์˜ ์ฝ”๋“œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ „์ฒด์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

โœ” ์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ : 15792KB
์‹œ๊ฐ„ : 96ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static int n, m, itemCnt;
    static int[][] map;
    static boolean[][][] checked; // ์œ„์น˜, ์ฑ™๊ธด ๋ฌผ๊ฑด
    static Pos start;
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};
    static public class Pos {
        int x; int y; int cnt; int time;
        public Pos (int x, int y, int cnt, int time) {
            this.x = x; this.y = y;
            this.cnt = cnt; this.time = time;
        }
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken()); // ๊ฐ€๋กœ
        m = Integer.parseInt(st.nextToken()); // ์„ธ๋กœ

        map = new int[m][n];
        for (int i = 0; i < m; i++) {
            String str = br.readLine();
            for (int j = 0; j < n; j++) {
                map[i][j] = str.charAt(j);
                // S : ๊ฒฝ์žฌ ์”จ์˜ ํ˜„์žฌ ์œ„์น˜
                // X : ์ฑ™๊ฒจ์•ผ ํ•˜๋Š” ๋ฌผ๊ฑด
                if (map[i][j] == 'S') {
                    start = new Pos(i, j, 0, 0);
                    map[i][j] = '.';
                } else if (map[i][j] == 'X') map[i][j] = itemCnt++;
            }
        }

        System.out.println(bfs());

        br.close();
    }

    private static int bfs() {
        Queue<Pos> que = new LinkedList<>();
        que.offer(start);

        int checkNum = (1 << itemCnt) - 1;
        checked = new boolean[m][n][checkNum+1];

        while (!que.isEmpty()) {
            Pos now = que.poll();

            // ๋‚˜๊ฐ€๋Š” ๋ฌธ
            if (map[now.x][now.y] == 'E') {
                // ๋ชจ๋“  ์•„์ดํ…œ ํš๋“
                if (checkNum == now.cnt) return now.time;
            }

            for (int d = 0; d < 4; d++) {
                int nx = now.x + dx[d];
                int ny = now.y + dy[d];

                if (rangeCheck(nx, ny)) continue; // ๋ฒ”์œ„ ์ฒดํฌ
                if (checked[nx][ny][now.cnt] || map[nx][ny] == '#') continue; // ์ด๋ฏธ ์ฑ™๊ธด ๋ฌผ๊ฑด, ๋ฒฝ -> ์ด๋™ X

                // ๋‹ค์Œ ์ฑ™๊ธธ ๋ฌผ๊ฑด
                int nextItem = now.cnt;
                if (map[nx][ny] <= itemCnt) nextItem |= 1 << map[nx][ny];

                checked[nx][ny][nextItem] = true;
                que.offer(new Pos(nx, ny, nextItem, now.time+1));
            }
        }

        return -1;
    }

    private static boolean rangeCheck(int x, int y) {
        return x < 0 || x >= m || y < 0 || y >= n;
    }
}

 

์˜ˆ์ „์— ๋น„ํŠธ ๋งˆ์Šคํ‚น์„ ํ™œ์šฉํ•ด ๋ฐฉ๋ฌธ ์ฒดํฌ๋ฅผ ํ•˜๋Š” ๋น„์Šทํ•œ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋˜ ๊ธฐ์–ต ๋•๋ถ„์— ๋น„๊ต์  ์‰ฝ๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๋น„ํŠธ ๋งˆ์Šคํ‚น์„ ํ™œ์šฉํ•ด ๋ฐฉ๋ฌธ ์ฒดํฌ๋ฅผ ํ•˜๋Š” ์œ ํ˜•์ด ์€๊ทผ ๋งŽ์ด ๋ณด์ด๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

๋ฐฑ์ค€์˜ ์„ฑ๊ณฝ, ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๋„ ๋น„์Šทํ•œ ๋ฌธ์ œ๋‹ˆ๊นŒ ๋‹ค์‹œ ํ•œ๋ฒˆ ํ’€๊ณ  ์ •๋ฆฌํ•ด์•ผ๊ฒ ๋‹ค ! ๐Ÿ‘Œ๐Ÿป๐ŸŒŸ