๋ฌธ์ œ ํ•ด๊ฒฐ (PS)/์ฝ”ํ…Œ TIL

[Java] ๋‹ค์ต์ŠคํŠธ๋ผ, BFS | ๋ฐฑ์ค€ 2665 ๋ฏธ๋กœ๋งŒ๋“ค๊ธฐ

9taetae9 2024. 11. 11. 14:47
728x90

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

 

 

์ ‘๊ทผ ๋ฐฉ๋ฒ• 

 

์ด ๋ฌธ์ œ๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ™œ์šฉํ•˜์—ฌ ํ’€ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๊ฐ ๋ฐฉ์„ ๋…ธ๋“œ๋กœ ๋ณด๊ณ , ๊ฒ€์€ ๋ฐฉ์—์„œ ํฐ ๋ฐฉ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์ž‘์—…์„ ๊ฐ€์ค‘์น˜๋กœ ๊ฐ„์ฃผํ•ด ์ตœ์†Œ ๋ณ€๊ฒฝ ํšŸ์ˆ˜ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•œ๋‹ค. ์ตœ๋‹จ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹Œ '์ตœ์†Œ ๋ณ€๊ฒฝ ํšŸ์ˆ˜'๋ฅผ ์ฐพ๋Š”๋‹ค๋Š” ์ ์ด ์ผ๋ฐ˜์ ์ธ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ์˜ ์ฐจ์ด๋‹ค.

 

์‹œ์ž‘๋ถ€ํ„ฐ ๋๋ฐฉ๊นŒ์ง€ ๊ฐ€๋Š” ๋™์•ˆ ๊ฒ€์€ ๋ฐฉ(0)์„ ์ตœ์†Œ๋กœ ์ง€๋‚˜์•ผ ํ•œ๋‹ค.

์ฆ‰ ํฐ ๋ฐฉ(1)์„ ์ง€๋‚˜๊ฐˆ ๋•Œ๋Š” ๋น„์šฉ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ๊ฒ€์€ ๋ฐฉ(0)์„ ๊ฑฐ์น  ๋•Œ๋Š” ๋น„์šฉ์ด 1 ๋งŒํผ ๋ฐœ์ƒํ•œ๋‹ค๊ณ  ๊ฐ„์ฃผํ•˜๊ณ , ์‹œ์ž‘๋ถ€ํ„ฐ ๋๋ฐฉ๊นŒ์ง€ BFS๋ฅผ ์ง„ํ–‰ํ•˜์—ฌ ์ตœ์†Œ ๋น„์šฉ์œผ๋กœ ๋๋ฐฉ์— ๋„์ฐฉํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค.

 

์šฐ์„ ์ˆœ์œ„ ํ(PriorityQueue)๋ฅผ ์‚ฌ์šฉํ•ด ํ˜„์žฌ ๋ณ€๊ฒฝ ํšŸ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ์ ์€ ๊ฒฝ๋กœ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ํ˜„์žฌ ๋…ธ๋“œ์˜ x,y ์ขŒํ‘œ์™€ ๋ณ€๊ฒฝ ํšŸ์ˆ˜๋ฅผ ์†์„ฑ์„ ๊ฐ€์ง€๋Š” Point ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค.

static class Point implements Comparable<Point>{
    int x, y;
    int change;

    Point (int x, int y, int change){
        this.x = x;
        this.y = y;
        this.change = change;
    }

    @Override
    public int compareTo(Point other){//change ์ž‘์€ ๊ฒƒ ์šฐ์„ 
        return Integer.compare(this.change, other.change);
    }
}

 

static int n;
static char[][] maze;
static int[][] visited;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};

 

visited ๋ฐฐ์—ด์€ ํ•ด๋‹น ์ง€์ ์˜ ์ตœ์†Œ ๋ณ€๊ฒฝ ํšŸ์ˆ˜๋ฅผ ์ €์žฅํ•œ๋‹ค. ์ดˆ๊ธฐ์˜ visited ๋ฐฐ์—ด์€ ์ตœ๋Œ€๊ฐ’์œผ๋กœ ์„ค์ •ํ•ด์ค€๋‹ค.

์šฐ์„ ์ˆœ์œ„ ํ์— ์‹œ์ž‘ ์ •์ (new Point(0,0,0))์„ ๋‹ด๊ณ  BFS ์ง„ํ–‰

 

์ƒํ•˜์ขŒ์šฐ๋กœ ์ด๋™ํ•˜๋ฉฐ change ๊ฐ’ ๊ณ„์‚ฐ ํ›„ visited ๋ฐฐ์—ด์„ ์—…๋ฐ์ดํŠธ ํ•ด์ค€๋‹ค.

  • '1'์ธ ์นธ์œผ๋กœ ์ด๋™ํ•  ๋•Œ๋Š” ๋น„์šฉ์ด ๋“ค์ง€ ์•Š์Œ (change + 0)
  • '0'์ธ ์นธ์œผ๋กœ ์ด๋™ํ•  ๋•Œ๋Š” ๋น„์šฉ์ด 1 ์ฆ๊ฐ€ (change + 1)

๋‹ค์Œ์œผ๋กœ change ๊ฐ’์ด ์ ์€ ์ •์ ์œผ๋กœ ์œ„ ๊ณผ์ •์„ ๋ ์ง€์  ๋„๋‹ฌ์‹œ ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

private static int solution() {
    visited = new int[n][n];
    for(int i=0; i<n; i++){
        Arrays.fill(visited[i], Integer.MAX_VALUE);
    }

    PriorityQueue<Point> q = new PriorityQueue<>();
    q.offer(new Point(0,0,0));

    while(!q.isEmpty()){
        Point current = q.poll();
        int x = current.x;
        int y = current.y;

        if(x== n-1 && y == n-1){
            return current.change;
        }

        for(int i=0; i<4; i++){
            int nextX = x + dx[i];
            int nextY = y + dy[i];

            if(nextX < 0 || nextX > n-1 || nextY < 0 || nextY > n-1) continue;

            int change = current.change + (maze[nextX][nextY] == '1' ? 0 : 1);

            if(change < visited[nextX][nextY]){
                visited[nextX][nextY] = change;
                q.offer(new Point(nextX, nextY, change));
            }
        }
    }

    return -1;
}

 

 

๋ฐฐ์šด์  :

์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋‹ค์–‘ํ•œ ๋ฌธ์ œ์— ์‘์šฉ๋  ์ˆ˜ ์žˆ์Œ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ํŠนํžˆ ์ด ๋ฌธ์ œ๋Š” ๊ทธ๋ž˜ํ”„์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹Œ ์ƒˆ๋กœ์šด ๊ธฐ์ค€(๋ณ€๊ฒฝ ํšŸ์ˆ˜)์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ํ’€์ด์˜ ํ•ต์‹ฌ์ด์˜€๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

728x90