๋ฐ˜์‘ํ˜•
Notice
Recent Posts
Recent Comments
Link
ยซ   2025/03   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Archives
Today
Total
03-11 05:31
๊ด€๋ฆฌ ๋ฉ”๋‰ด

ImJay

[BOJ/Java] 2931. ๊ฐ€์Šค๊ด€ ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜/BOJ - Java

[BOJ/Java] 2931. ๊ฐ€์Šค๊ด€

ImJay 2025. 3. 10. 10:31
๋ฐ˜์‘ํ˜•

๐Ÿ“Œ [BOJ/Java] 2931. ๊ฐ€์Šค๊ด€


๐Ÿ’ก ๋ฌธ์ œ ํ•ด์„

๋„์‹œ์—๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ€์Šค๊ด€์ด ์„ค์น˜๋˜์–ด ์žˆ์œผ๋ฉฐ, ๊ฐ€์Šค๊ด€์€ ์ผ์ •ํ•œ ํŒจํ„ด์˜ ๋ธ”๋ก์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.
์–ด๋Š ๋‚  ํ•˜๋‚˜์˜ ๋ธ”๋ก์ด ์‚ฌ๋ผ์ง€๋Š” ์‚ฌ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ, ์ด๋ฅผ ์ฐพ์•„ ์›๋ž˜์˜ ๋ธ”๋ก์„ ๋ณต๊ตฌํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿ”น ์ฃผ์–ด์ง„ ์ •๋ณด

  • N × M ํฌ๊ธฐ์˜ ๋„์‹œ ์ง€๋„ (.: ๋นˆ์นธ, + - | 1 2 3 4 M Z: ๊ฐ€์Šค๊ด€)
  • M: ๊ฐ€์Šค๊ฐ€ ์‹œ์ž‘๋˜๋Š” ์œ„์น˜
  • Z: ๊ฐ€์Šค๊ฐ€ ๋„์ฐฉํ•˜๋Š” ์œ„์น˜

โœ… ๋ชฉํ‘œ:
1๏ธโƒฃ ์‚ฌ๋ผ์ง„ ๋ธ”๋ก์˜ ์œ„์น˜๋ฅผ ์ฐพ์•„ ์ถœ๋ ฅ
2๏ธโƒฃ ํ•ด๋‹น ์œ„์น˜์— ๋“ค์–ด๊ฐˆ ์˜ฌ๋ฐ”๋ฅธ ๋ธ”๋ก ์ข…๋ฅ˜๋ฅผ ์ถœ๋ ฅ


๐Ÿ“ ํ’€์ด ๊ณผ์ •

1๏ธโƒฃ ์‚ฌ๋ผ์ง„ ๋ธ”๋ก(.) ์ฐพ๊ธฐ

  • ๊ฐ€์Šค๊ด€์„ ๋”ฐ๋ผ๊ฐ€๋‹ค๊ฐ€ ์—ฐ๊ฒฐ์ด ๋Š๊ธด ์ง€์ ์„ ์ฐพ๋Š”๋‹ค.

2๏ธโƒฃ ์‚ฌ๋ผ์ง„ ๋ธ”๋ก์ด ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ ํƒ์ƒ‰

  • + - | 1 2 3 4 ์ค‘ ์˜ฌ๋ฐ”๋ฅธ ๋ธ”๋ก์„ ๊ฒฐ์ •
  • ์—ฐ๊ฒฐ๋œ ๋ธ”๋ก๋“ค์˜ ๋ฐฉํ–ฅ์„ ๊ณ ๋ คํ•˜์—ฌ ๊ฐ€๋Šฅํ•œ ๋ธ”๋ก์„ ์ฐพ๋Š”๋‹ค.

3๏ธโƒฃ BFS๋ฅผ ํ™œ์šฉํ•œ ๊ฐ€์Šค๊ด€ ํƒ์ƒ‰

  • M์—์„œ ์‹œ์ž‘ํ•˜์—ฌ ๊ฐ€์Šค๊ด€์„ ๋”ฐ๋ผ ์ด๋™ํ•˜๋ฉฐ ์—ฐ๊ฒฐ๋œ ๋ธ”๋ก ํƒ์ƒ‰
  • .์„ ๋งŒ๋‚˜๋Š” ์ˆœ๊ฐ„ ๋Š์–ด์กŒ์œผ๋ฏ€๋กœ ์‚ฌ๋ผ์ง„ ๋ธ”๋ก์˜ ์œ„์น˜ ๊ธฐ๋ก

๐Ÿ’ป ์ฝ”๋“œ (Java)

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    static int R, C;
    static char[][] map;

    static final int[] dx = {-1, 1, 0, 0};  // ์ƒ, ํ•˜, ์ขŒ, ์šฐ
    static final int[] dy = {0, 0, -1, 1};

    static final int TOP = 0, BOTTOM = 1, LEFT = 2, RIGHT = 3;

    public static void main(String[] args) throws Exception {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

        String[] input = in.readLine().split(" ");
        R = Integer.parseInt(input[0]);
        C = Integer.parseInt(input[1]);
        map = new char[R][C];

        for (int i = 0; i < R; i++) {
            map[i] = in.readLine().toCharArray();
        }

        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                if (map[i][j] == '.' && check(i, j)) {
                    return;
                }
            }
        }
    }

    private static boolean check(int x, int y) {
        boolean[] connected = new boolean[4];

        if (isValid(x + dx[TOP], y + dy[TOP]) && canComeBottom(map[x + dx[TOP]][y + dy[TOP]])) {
            connected[TOP] = true;
        }
        if (isValid(x + dx[BOTTOM], y + dy[BOTTOM]) && canComeTop(map[x + dx[BOTTOM]][y + dy[BOTTOM]])) {
            connected[BOTTOM] = true;
        }
        if (isValid(x + dx[LEFT], y + dy[LEFT]) && canComeRight(map[x + dx[LEFT]][y + dy[LEFT]])) {
            connected[LEFT] = true;
        }
        if (isValid(x + dx[RIGHT], y + dy[RIGHT]) && canComeLeft(map[x + dx[RIGHT]][y + dy[RIGHT]])) {
            connected[RIGHT] = true;
        }

        char correctPipe = findCorrectPipe(connected);
        if (correctPipe != '?') {
            System.out.println((x + 1) + " " + (y + 1) + " " + correctPipe);
            return true;
        }

        return false;
    }

    private static char findCorrectPipe(boolean[] connected) {
        if (connected[TOP] && connected[BOTTOM] && connected[LEFT] && connected[RIGHT]) return '+';
        if (connected[TOP] && connected[BOTTOM]) return '|';
        if (connected[LEFT] && connected[RIGHT]) return '-';
        if (connected[BOTTOM] && connected[RIGHT]) return '1';
        if (connected[TOP] && connected[RIGHT]) return '2';
        if (connected[TOP] && connected[LEFT]) return '3';
        if (connected[BOTTOM] && connected[LEFT]) return '4';
        return '?';
    }

    private static boolean canComeTop(char c) {
        return c == '|' || c == '+' || c == '2' || c == '3';
    }

    private static boolean canComeBottom(char c) {
        return c == '|' || c == '+' || c == '1' || c == '4';
    }

    private static boolean canComeLeft(char c) {
        return c == '-' || c == '+' || c == '3' || c == '4';
    }

    private static boolean canComeRight(char c) {
        return c == '-' || c == '+' || c == '1' || c == '2';
    }

    private static boolean isValid(int x, int y) {
        return x >= 0 && x < R && y >= 0 && y < C;
    }
}

โฑ ์‹œ๊ฐ„ ๋ณต์žก๋„ ๋ถ„์„

  • BFS ํƒ์ƒ‰ → O(N × M)
  • ๊ฐ€๋Šฅํ•œ ๋ธ”๋ก ํƒ์ƒ‰ → O(7 × 4) = O(28) (์ƒ์ˆ˜ ์‹œ๊ฐ„)
  • ์ด ์‹œ๊ฐ„ ๋ณต์žก๋„ → O(N × M), ์ถฉ๋ถ„ํžˆ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ

๐Ÿง ๋Š๋‚€ ์ 

โœ… ์–‘๋ฐฉํ–ฅ ์—ฐ๊ฒฐ์„ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ–ˆ๋‹ค.
โœ… ์˜ฌ๋ฐ”๋ฅธ ๋ธ”๋ก์„ ์ฐพ์„ ๋•Œ ๋ชจ๋“  ๋ฐฉํ–ฅ์—์„œ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•ด์•ผ ํ–ˆ๋‹ค.
โœ… ์ถœ๋ ฅ ์ขŒํ‘œ๋Š” 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ–ˆ๋‹ค.

๐Ÿš€ ๋””ํ…Œ์ผํ•œ ์กฐ๊ฑด์„ ์ •ํ™•ํžˆ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ธ ๋ฌธ์ œ์˜€๋‹ค! ๐Ÿ˜Š

๋ฐ˜์‘ํ˜•
Comments