Algorithm/BFS & DFS

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค, Java] ๋น›์˜ ๊ฒฝ๋กœ ์‚ฌ์ดํด

Zayson 2022. 4. 28. 00:08

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

https://programmers.co.kr/learn/courses/30/lessons/86052

๐Ÿค” ๋ฌธ์ œ

๊ฐ ์นธ๋งˆ๋‹ค S, L, ๋˜๋Š” R๊ฐ€ ์จ์ ธ ์žˆ๋Š” ๊ฒฉ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ด ๊ฒฉ์ž์—์„œ ๋น›์„ ์˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฉ์ž์˜ ๊ฐ ์นธ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ดํ•œ ์„ฑ์งˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋น›์ด "S"๊ฐ€ ์จ์ง„ ์นธ์— ๋„๋‹ฌํ•œ ๊ฒฝ์šฐ, ์ง์ง„ํ•ฉ๋‹ˆ๋‹ค.
  • ๋น›์ด "L"์ด ์จ์ง„ ์นธ์— ๋„๋‹ฌํ•œ ๊ฒฝ์šฐ, ์ขŒํšŒ์ „์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋น›์ด "R"์ด ์จ์ง„ ์นธ์— ๋„๋‹ฌํ•œ ๊ฒฝ์šฐ, ์šฐํšŒ์ „์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋น›์ด ๊ฒฉ์ž์˜ ๋์„ ๋„˜์–ด๊ฐˆ ๊ฒฝ์šฐ, ๋ฐ˜๋Œ€์ชฝ ๋์œผ๋กœ ๋‹ค์‹œ ๋Œ์•„์˜ต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋น›์ด 1ํ–‰์—์„œ ํ–‰์ด ์ค„์–ด๋“œ๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•  ๊ฒฝ์šฐ, ๊ฐ™์€ ์—ด์˜ ๋ฐ˜๋Œ€์ชฝ ๋ ํ–‰์œผ๋กœ ๋‹ค์‹œ ๋Œ์•„์˜ต๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ์ด ๊ฒฉ์ž ๋‚ด์—์„œ ๋น›์ด ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ ์‚ฌ์ดํด์ด ๋ช‡ ๊ฐœ ์žˆ๊ณ , ๊ฐ ์‚ฌ์ดํด์˜ ๊ธธ์ด๊ฐ€ ์–ผ๋งˆ์ธ์ง€ ์•Œ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๋กœ ์‚ฌ์ดํด์ด๋ž€, ๋น›์ด ์ด๋™ํ•˜๋Š” ์ˆœํ™˜ ๊ฒฝ๋กœ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ ๊ทธ๋ฆผ์€ ๊ฒฉ์ž ["SL","LR"]์—์„œ 1ํ–‰ 1์—ด์—์„œ 2ํ–‰ 1์—ด ๋ฐฉํ–ฅ์œผ๋กœ ๋น›์„ ์  ๊ฒฝ์šฐ, ํ•ด๋‹น ๋น›์ด ์ด๋™ํ•˜๋Š” ๊ฒฝ๋กœ ์‚ฌ์ดํด์„ ํ‘œํ˜„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/f3c02c50-f82e-45d0-b633-ad3ecadba316/ex1.png

์ด ๊ฒฉ์ž์—๋Š” ๊ธธ์ด๊ฐ€ 16์ธ ์‚ฌ์ดํด 1๊ฐœ๊ฐ€ ์žˆ์œผ๋ฉฐ, ๋‹ค๋ฅธ ์‚ฌ์ดํด์€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฒฉ์ž์˜ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” 1์ฐจ์› ๋ฌธ์ž์—ด ๋ฐฐ์—ด grid๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ๊ฒฉ์ž๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง€๋Š” ๋น›์˜ ๊ฒฝ๋กœ ์‚ฌ์ดํด์˜ ๋ชจ๋“  ๊ธธ์ด๋“ค์„ ๋ฐฐ์—ด์— ๋‹ด์•„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

๐Ÿ“Œ ์ œํ•œ์‚ฌํ•ญ

  • 1 โ‰ค grid์˜ ๊ธธ์ด โ‰ค 500
    • 1 โ‰ค grid์˜ ๊ฐ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด โ‰ค 500
    • grid์˜ ๋ชจ๋“  ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋Š” ์„œ๋กœ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    • grid์˜ ๋ชจ๋“  ๋ฌธ์ž์—ด์€ 'L', 'R', 'S'๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ˜ฎ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๊ฐ ๋…ธ๋“œ์˜ ์ง„์ž… ๊ฒฝ๋กœ (์ƒ, ํ•˜, ์ขŒ, ์šฐ)์—์„œ ๋น›์ด ๋“ค์–ด์˜จ ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋‘ ํŒ๋‹จํ•˜๊ณ , ์ด๋ฏธ ํ•ด๋‹น ์ง„์ž… ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜จ ๊ฒฝ์šฐ๋ฅผ ๋งŒ๋‚˜๋ฉด ์‚ฌ์ดํด์ด ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜๋ฉด ๋œ๋‹ค.

์ฆ‰, ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋ชจ๋“  ๋…ธ๋“œ ๋ฐ ๋ฐฉํ–ฅ์— ๋Œ€ํ•ด BFS๋ฅผ ์ง„ํ–‰ํ•ด์ฃผ๊ณ , ๊ฐ ๋…ธ๋“œ์˜ โ€œSโ€,โ€Lโ€,โ€Rโ€ ์— ๋”ฐ๋ผ ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ง„์ž… ๋ฐฉํ–ฅ์„ ๊ฒฐ์ •ํ•ด ์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋น›์ด ๊ฒฉ์ž์˜ ๋งˆ์ง€๋ง‰์— ๋‹ค๋‹ค๋ฅธ ๊ฒฝ์šฐ ๋ฐ˜๋Œ€์ชฝ ๋์œผ๋กœ ์˜ค๋Š” ๊ฒฝ์šฐ๋งŒ ์ฒดํฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

ํ•˜๋‚˜์˜ ๋…ธ๋“œ์—์„œ ์ƒ, ํ•˜, ์ขŒ, ์šฐ ๋ฐฉํ–ฅ์„ ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€ ๋ชจ๋‘ ์ฒดํฌํ•ด์ฃผ์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋ฐฉ๋ฌธ ๋ฐฐ์—ด์€ 3์ฐจ์› ๋ฐฐ์—ด(ํ–‰, ์—ด, ๋ฐฉํ–ฅ)์œผ๋กœ ์„ ์–ธํ•ด์„œ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•œ๋‹ค.

๋จผ์ € ๊ฐ ๋…ธ๋“œ์˜ ์ง„์ž… ๋ฐฉํ–ฅ ๋ณ„ ๋‹ค์Œ ๋…ธ๋“œ์˜ ๋ฐฉํ–ฅ์ด ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

  1. ์ƒ,ํ•˜,์ขŒ,์šฐ ๋ฐฉํ–ฅ์„ ๊ฐ๊ฐ 0, 1, 2, 3์œผ๋กœ ๋ณธ๋‹ค.

  2. ์ง„์ž… ๋…ธ๋“œ ๋ฐฉํ–ฅ ๋ณ„ ๋‹ค์Œ ๋…ธ๋“œ ์ง„์ž… ๋ฐฉํ–ฅ ํŒ๋‹จ

    1. ์ง„์ž… ๋…ธ๋“œ๊ฐ€ โ€œSโ€์ธ ๊ฒฝ์šฐ

      image

    2. ์ง„์ž… ๋…ธ๋“œ๊ฐ€ โ€œLโ€์ธ ๊ฒฝ์šฐ

      image

    3. ์ง„์ž… ๋…ธ๋“œ๊ฐ€ โ€œRโ€์ธ ๊ฒฝ์šฐ

      image

์ง„์ž… ๋…ธ๋“œ์˜ โ€œSโ€, โ€œLโ€, โ€œRโ€ ๋ณ„ ๋‹ค์Œ ๋…ธ๋“œ ์ง„์ž… ๋ฐฉํ–ฅ์„ ํ‘œ๋กœ ์ •๋ฆฌํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

โ€œSโ€ โ€œLโ€ โ€œRโ€
์ƒ (0) ์ƒ (0) ์ขŒ (2) ์šฐ (3)
ํ•˜ (1) ํ•˜ (1) ์šฐ (3) ์ขŒ (2)
์ขŒ (2) ์ขŒ (2) ์ƒ (0) ์ƒ (0)
์šฐ (3) ์šฐ (3) ํ•˜ (1) ํ•˜ (1)

๋‘๋ฒˆ์งธ๋กœ, ๋‹ค์Œ ์ง„์ž… ๋…ธ๋“œ๊ฐ€ ๋์„ ๋„˜์–ด๊ฐ„ ๊ฒฝ์šฐ ํŒ๋‹จ

  1. ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ง„์ถœ ๋ฐฉํ–ฅ์ด ๋งˆ์ง€๋ง‰ ํ–‰(n-1) ์˜ ํ•˜๋‹จ์ธ ๊ฒฝ์šฐ ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ง„์ž… ๋ฐฉํ–ฅ์€ ์ฒซ๋ฒˆ์งธ ํ–‰ โ€˜0(์ƒ)โ€™ ๋ฐฉํ–ฅ
    1. ์ง„์ž… ๋ฐฉํ–ฅ์ด ์ƒ๋‹จ (0)์ด๊ณ  ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ โ€œSโ€
    2. ์ง„์ž… ๋ฐฉํ–ฅ์ด ์šฐ์ธก (3)์ด๊ณ  ํ˜„์žฌ๋…ธ๋“œ๊ฐ€ โ€œLโ€
    3. ์ง„์ž… ๋ฐฉํ–ฅ์ด ์ขŒ์ธก (2)์ด๊ณ  ํ˜„์žฌ๋…ธ๋“œ๊ฐ€ โ€œRโ€
    4. ๋‹ค์Œ ๋…ธ๋“œ์˜ nextRow = 0
  2. ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ง„์ถœ ๋ฐฉํ–ฅ์ด ์ฒซ๋ฒˆ์žฌ ํ–‰์˜ ์ƒ๋‹จ์ธ ๊ฒฝ์šฐ ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ง„์ž… ๋ฐฉํ–ฅ์€ ๋งˆ์ง€๋ง‰ ํ–‰(n-1)์˜ โ€˜1(ํ•˜)โ€™ ๋ฐฉํ–ฅ
    1. ์ง„์ž… ๋ฐฉํ–ฅ์ด ํ•˜๋‹จ (1)์ด๊ณ  ํ˜„์žฌ๋…ธ๋“œ๊ฐ€ โ€œSโ€
    2. ์ง„์ž… ๋ฐฉํ–ฅ์ด ์ขŒ์ธก (2)์ด๊ณ  ํ˜„์žฌ๋…ธ๋“œ๊ฐ€ โ€œLโ€
    3. ์ง„์ž… ๋ฐฉํ–ฅ์ด ์šฐ์ธก (3)์ด๊ณ  ํ˜„์žฌ๋…ธ๋“œ๊ฐ€ โ€œRโ€
    4. ๋‹ค์Œ ๋…ธ๋“œ์˜ nextRow = n-1
  3. ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ง„์ถœ ๋ฐฉํ–ฅ์ด ๋งˆ์ง€๋ง‰ ์—ด(n-1)์˜ ์šฐ์ธก์ธ ๊ฒฝ์šฐ ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ง„์ž… ๋ฐฉํ–ฅ์€ ์ฒซ๋ฒˆ์งธ ์—ด์˜ โ€˜2(์ขŒ)โ€™ ๋ฐฉํ–ฅ
    1. ์ง„์ž… ๋ฐฉํ–ฅ์ด ์ขŒ์ธก (2)์ด๊ณ  ํ˜„์žฌ๋…ธ๋“œ๊ฐ€ โ€œSโ€
    2. ์ง„์ž… ๋ฐฉํ–ฅ์ด ํ•˜๋‹จ (1)์ด๊ณ  ํ˜„์žฌ๋…ธ๋“œ๊ฐ€ โ€œRโ€
    3. ์ง„์ž… ๋ฐฉํ–ฅ์ด ์ƒ๋‹จ (0)์ด๊ณ  ํ˜„์žฌ๋…ธ๋“œ๊ฐ€ โ€œLโ€
    4. ๋‹ค์Œ ๋…ธ๋“œ์˜ nextCol = 0
  4. ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ง„์ถœ ๋ฐฉํ–ฅ์ด ์ฒซ๋ฒˆ์งธ ์—ด์˜ ์ขŒ์ธก์ธ ๊ฒฝ์šฐ ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ง„์ž… ๋ฐฉํ–ฅ์€ ๋งˆ์ง€๋ง‰ ์—ด(n-1)์˜ โ€˜3(์šฐ)โ€™ ๋ฐฉํ–ฅ
    1. ์ง„์ž… ๋ฐฉํ–ฅ์ด ์šฐ์ธก (3)์ด๊ณ  ํ˜„์žฌ๋…ธ๋“œ๊ฐ€ โ€œSโ€
    2. ์ง„์ž… ๋ฐฉํ–ฅ์ด ํ•˜๋‹จ (1)์ด๊ณ  ํ˜„์žฌ๋…ธ๋“œ๊ฐ€ โ€œLโ€
    3. ์ง„์ž… ๋ฐฉํ–ฅ์ด ์ƒ๋‹จ (2)์ด๊ณ  ํ˜„์žฌ๋…ธ๋“œ๊ฐ€ โ€œRโ€
    4. ๋‹ค์Œ ๋…ธ๋“œ์˜ nxtCol = n-1

image

๋งˆ์ง€๋ง‰์œผ๋กœ, ๋น›์ด ๋…ธ๋“œ์— ์ง„์ž…ํ•  ๋•Œ๋งˆ๋‹ค ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๊ณ , ์ง„์ถœํ•  ๋•Œ๋งˆ๋‹ค ์‚ฌ์ดํด ํšŸ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๊ณ , ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ง„์ž… ๋ฐฉํ–ฅ์ด ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋ฐฉํ–ฅ์ด๋ฉด ์‚ฌ์ดํด ํšŸ์ˆ˜๋ฅผ ์ •๋‹ต๋ฐฐ์—ด์— ๋„ฃ์–ด์ค€๋‹ค.

๐Ÿšฉ Java ์ฝ”๋“œ

package com.algorithm.Programmers.Lv2;

import java.util.*;

public class Solution_86052_๋น›์˜_๊ฒฝ๋กœ_์‚ฌ์ดํด {
    public static void main(String[] args) {
        String[] grid = {"R","R"};
        int[] solution = solution(grid);
        for (int x : solution) System.out.println("x = " + x);
    }
    static class Point {
        private int row;
        private int col;
        private int dir;

        public Point(int row, int col, int dir) {
            this.row = row;
            this.col = col;
            this.dir = dir;
        }

        public int getRow() {
            return row;
        }

        public int getCol() {
            return col;
        }

        public int getDir() {
            return dir;
        }
    }
    private static String[][] map;
    private static boolean[][][] visited;
    private static int[] solution(String[] grid) {
        map = new String[grid.length][grid[0].length()];
        visited = new boolean[grid.length][grid[0].length()][4];
        List<Integer> answerList = new ArrayList<>();

        for (int row = 0; row < grid.length; row++) {
            for (int col = 0; col < grid[row].length(); col++) {
                map[row][col] = String.valueOf(grid[row].charAt(col));
            }
        }
        for(int row = 0; row< map.length; row++) {
            for(int col = 0; col < map[row].length; col++){
                // 0 : ์ƒ, 1: ํ•˜, 2: ์ขŒ, 3: ์šฐ
                for(int direction = 0; direction < 4; direction++) {
                    if(!visited[row][col][direction]) {
                        answerList.add(searchPath(row, col, direction));
                    }
                }
            }
        }
        Collections.sort(answerList);
        return answerList.stream().mapToInt(Integer::intValue).toArray();
    }

    private static int searchPath(int row, int col, int direction) {
        int count = 0;
        Queue<Point> queue = new LinkedList<>();
        queue.add(new Point(row, col, direction));

        while(!queue.isEmpty()) {
            Point point = queue.poll();
            int curX = point.getRow();
            int curY = point.getCol();
            int curDir = point.getDir();

            if(visited[curX][curY][curDir]) return count;
            visited[curX][curY][curDir] = true;

            // ๋‹ค์Œ ๋…ธ๋“œ ์ง„์ž… ๋ฐฉํ–ฅ ๊ตฌํ•˜๊ธฐ
            Point next = nextPath(curX, curY, curDir);

            // ๋‹ค์Œ ๋…ธ๋“œ ํ์— ์ถ”๊ฐ€
            queue.add(new Point(next.getRow(), next.getCol(), next.getDir()));

            // ์ง„์ž…ํ•œ ๋…ธ๋“œ ๊ฐฏ์ˆ˜ ์ฆ๊ฐ€
            count++;
        }

        return count;
    }

    // ๋‹ค์Œ ๋…ธ๋“œ ์ง„์ž… ๋ฐฉํ–ฅ ๊ตฌํ•˜๊ธฐ
    private static Point nextPath(int curX, int curY, int curDir) {
        int nextRow = curX;
        int nextCol = curY;
        int nextDir = curDir;

        // ํ˜„์žฌ ๋…ธ๋“œ ์ง„์ž… ๋ฐฉํ–ฅ ๋ณ„ ๋‹ค์Œ ๋…ธ๋“œ ์ง„์ž… ๋ฐฉํ–ฅ
        if((map[curX][curY].equals("S") && curDir ==0) || (map[curX][curY].equals("L") && curDir == 3) || (map[curX][curY].equals("R") && curDir == 2)) {
            nextRow = curX +1;
            nextDir = 0;
        }
        else if((map[curX][curY].equals("S") && curDir ==1) || (map[curX][curY].equals("L") && curDir == 2) || (map[curX][curY].equals("R") && curDir == 3)) {
            nextRow = curX -1;
            nextDir = 1;
        }
        else if((map[curX][curY].equals("S") && curDir ==2) || (map[curX][curY].equals("L") && curDir == 0) || (map[curX][curY].equals("R") && curDir == 1)) {
            nextCol = curY +1;
            nextDir = 2;
        }
        else {
            nextCol =  curY-1;
            nextDir = 3;
        }

        // ๋‹ค์Œ ๋…ธ๋“œ์˜ ํ–‰ ํ˜น์€ ์—ด์ด ๋ฒ”์œ„ ๋ฐ–์œผ๋กœ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ ์ฒดํฌ
        if(checkEndpoint(nextRow, nextCol)) {
            if(nextDir == 0) {
                nextRow = 0;
            }
            else if(nextDir == 1) {
                nextRow = map.length-1;
            }
            else if(nextDir == 2) {
                nextCol = 0;
            }
            else {
                nextCol = map[nextRow].length-1;
            }
        }
        return new Point(nextRow, nextCol, nextDir);
    }

    private static boolean checkEndpoint(int nextRow, int nextCol) {
        return nextRow < 0 || nextRow >= map.length || nextCol < 0 || nextCol >= map[nextRow].length;
    }
}
๋ฐ˜์‘ํ˜•