View

λ°˜μ‘ν˜•

1987번: μ•ŒνŒŒλ²³

문제

μ„Έλ‘œ RμΉΈ, κ°€λ‘œ C칸으둜 된 ν‘œ λͺ¨μ–‘μ˜ λ³΄λ“œκ°€ μžˆλ‹€. λ³΄λ“œμ˜ 각 μΉΈμ—λŠ” λŒ€λ¬Έμž μ•ŒνŒŒλ²³μ΄ ν•˜λ‚˜μ”© μ ν˜€ 있고, 쒌츑 상단 μΉΈ (1ν–‰ 1μ—΄) μ—λŠ” 말이 놓여 μžˆλ‹€.

말은 μƒν•˜μ’Œμš°λ‘œ μΈμ ‘ν•œ λ„€ μΉΈ μ€‘μ˜ ν•œ 칸으둜 이동할 수 μžˆλŠ”λ°, μƒˆλ‘œ μ΄λ™ν•œ 칸에 μ ν˜€ μžˆλŠ” μ•ŒνŒŒλ²³μ€ μ§€κΈˆκΉŒμ§€ μ§€λ‚˜μ˜¨ λͺ¨λ“  칸에 μ ν˜€ μžˆλŠ” μ•ŒνŒŒλ²³κ³ΌλŠ” 달라야 ν•œλ‹€. 즉, 같은 μ•ŒνŒŒλ²³μ΄ 적힌 칸을 두 번 지날 수 μ—†λ‹€.

쒌츑 μƒλ‹¨μ—μ„œ μ‹œμž‘ν•΄μ„œ, 말이 μ΅œλŒ€ν•œ λͺ‡ 칸을 지날 수 μžˆλŠ”μ§€λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. 말이 μ§€λ‚˜λŠ” 칸은 쒌츑 μƒλ‹¨μ˜ 칸도 ν¬ν•¨λœλ‹€.

μž…λ ₯

첫째 쀄에 Rκ³Ό Cκ°€ λΉˆμΉΈμ„ 사이에 두고 주어진닀. (1 ≀ R,C ≀ 20) λ‘˜μ§Έ 쀄뢀터 R개의 쀄에 κ±Έμ³μ„œ λ³΄λ“œμ— μ ν˜€ μžˆλŠ” C개의 λŒ€λ¬Έμž μ•ŒνŒŒλ²³λ“€μ΄ 빈칸 없이 주어진닀.

좜λ ₯

첫째 쀄에 말이 지날 수 μžˆλŠ” μ΅œλŒ€μ˜ μΉΈ 수λ₯Ό 좜λ ₯ν•œλ‹€.

예제 μž…λ ₯ 1

2 4
CAAB
ADCB

예제 좜λ ₯ 1

3

F0143119-A267-4904-A879-CA5B7806478B.jpeg


πŸ€¦β€β™€οΈ My Solution

package WS;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main_1987 {

    static char map[][];
    // λ°©ν–₯탐색
    static int[] dy = { -1, 1, 0, 0 };
    static int[] dx = { 0, 0, -1, 1 };
    static boolean[] check;

    static int R, C;
    static int max = Integer.MIN_VALUE;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        R = Integer.parseInt(st.nextToken());
        C = Integer.parseInt(st.nextToken());
        map = new char[R][];
        check = new boolean[26]; // μ•ŒνŒŒλ²³μ˜ μ‚¬μš©μ—¬λΆ€ 체크

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

        check[map[0][0] - 'A'] = true; // 첫 μ‹œμž‘μ μ˜ μ•ŒνŒŒλ²³μ€ μ‚¬μš©ν–ˆλ‹€κ³  체크
        dfs(0, 0, 1);
        System.out.println(max);
    }

    static void dfs(int x, int y, int cnt) {
        if (cnt > max) // μ§€μ—­λ³€μˆ˜ cntλ₯Ό λ‚˜μ€‘μ—λ„ μ“°κΈ° μœ„ν•΄μ„œ μ „μ—­λ³€μˆ˜μΈ maxλ₯Ό μ΄μš©ν•΄μ„œ μ΅œλŒ“κ°’ 좜λ ₯
            max = cnt;

        for (int d = 0; d < 4; d++) { // μƒν•˜μ’Œμš° 탐색
            int nx = x + dx[d];
            int ny = y + dy[d];

            if (nx < 0 || ny < 0 || ny >= R || nx >= C || check[map[ny][nx] - 'A'] == true)
                continue;
            check[map[ny][nx] - 'A'] = true;
            dfs(nx, ny, cnt + 1);
            check[map[ny][nx] - 'A'] = false;
        }

    }
}

λ°˜μ‘ν˜•
Share Link
reply
λ°˜μ‘ν˜•
Β«   2024/11   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
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