๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

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

 

14503๋ฒˆ: ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ

์ฒซ์งธ ์ค„์— ๋ฐฉ์˜ ํฌ๊ธฐ $N$๊ณผ $M$์ด ์ž…๋ ฅ๋œ๋‹ค. $(3 \le N, M \le 50)$โ€Š ๋‘˜์งธ ์ค„์— ์ฒ˜์Œ์— ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์˜ ์ขŒํ‘œ $(r, c)$์™€ ์ฒ˜์Œ์— ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ $d$๊ฐ€ ์ž…๋ ฅ๋œ๋‹ค. $d$๊ฐ€ $0$์ธ ๊ฒฝ์šฐ ๋ถ์ชฝ

www.acmicpc.net


1. ๋ฌธ์ œ

NxMํฌ๊ธฐ์˜ ๋งต์—์„œ ์ฃผ์–ด์ง„ ์กฐ๊ฑด์— ๋งž๊ฒŒ ๋กœ๋ด‡์ฒญ์†Œ๊ธฐ๊ฐ€ ์ด๋™ํ•œ๋‹ค.

๋กœ๋ด‡์ฒญ์†Œ๊ธฐ๊ฐ€ ์ž‘๋™์„ ๋ฉˆ์ถœ ๋•Œ๊นŒ์ง€ ์ฒญ์†Œํ•˜๋Š” ์นธ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

[์กฐ๊ฑด]

1. ํ˜„์žฌ์นธ ์ฃผ๋ณ€ 4์นธ ํƒ์ƒ‰ ์‹œ (๋ฐ˜๋ณต)

 - ํ˜„์žฌ ๋ฐฉํ–ฅ ๊ธฐ์ค€ ๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ 90๋„ ํšŒ์ „

 - ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์„ ๊ธฐ์ค€์œผ๋กœ ์•ž ์นธ์ด ๋น„์–ด์žˆ์œผ๋ฉด ์•ž ์นธ์œผ๋กœ ์ „์ง„ํ•œ๋‹ค.

2. ์ฃผ๋ณ€ 4์นธ ๋ชจ๋‘ ๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ

 - ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์„ ์œ ์ง€ํ•œ ์ฑ„ ํ•œ ์นธ ํ›„์ง„ ํ›„ ์žฌํƒ์ƒ‰

 - ํ•œ ์นธ ํ›„์ง„ํ•˜๋ฉด ๋ฒฝ์ธ ๊ฒฝ์šฐ ๋กœ๋ด‡์ฒญ์†Œ๊ธฐ ์ž‘๋™ ๋ฉˆ์ถค.

 

2. ํ’€์ด

dfs๋กœ ํ’€์—ˆ๋‹ค.

์ฃผ์˜ํ•  ์ ์€ 3๊ฐ€์ง€์ด๋‹ค.

1. ๋ฐฉํ–ฅ

2. return

3. ํ›„์ง„

 

1.๋ฐฉํ–ฅ

๋ฐฉํ–ฅ์€ ๋ฌธ์ œ์—์„œ ๋ถ->๋™->๋‚จ->์„œ ์ˆœ์„œ๋กœ 0123์œผ๋กœ ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค.

ํ•˜์ง€๋งŒ ํ•จ์ •์ธ๊ฒŒ, ํ˜„์žฌ ๋ฐฉํ–ฅ ๊ธฐ์ค€์œผ๋กœ ๋ฐ˜์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ 90๋„ ํšŒ์ „ํ•œ ๋ฐฉํ–ฅ์„ ํƒ์ƒ‰ํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ 4๋ฒˆ ๋ฐ˜๋ณตํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ๋ณด๋Š” ๋ฐฉํ–ฅ์€ (์‹œ์ž‘๋ฐฉํ–ฅ+3)%4 ๋กœ ๋ฐ˜์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ 90๋„ ํšŒ์ „ํ•œ ๋ฐฉํ–ฅ์„ ๋ณธ๋‹ค.

=> 4๋ฒˆ ๋ฐ˜๋ณตํ•˜๋Š” ์ด์œ ๋Š” ๋งค ํ„ด๋งˆ๋‹ค ๊ฐฑ์‹ ๋œ ๋ฐฉํ–ฅ ๊ธฐ์ค€์œผ๋กœ ๋ฐ˜์‹œ๊ณ„๋ฐฉํ–ฅ 90๋„๋กœ ๋˜ ๊ฐฑ์‹ ์ด ๋˜์–ด 4๋ฒˆ ๋ฐ˜๋ณตํ•˜๋ฉด ๋ชจ๋“  ๋ฐฉํ–ฅ์„ ๋ณด๊ฒŒ ๋œ๋‹ค.

 

2. return

4๋ฐฉํƒ์ƒ‰ ์ค‘ return ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๋ฌธ์ œ ์กฐ๊ฑด์— ๋งž๋Š” ๋ฐฉํ–ฅ๋Œ€๋กœ dfs ํ•ด์คฌ๋‹ค๊ฐ€ dfs ๋‹ค ๋๋‚˜๊ณ  ๋Œ์•„์˜ค๋Š” ๊ธธ์—

return์ด ์•ˆ๋˜์–ด์žˆ์–ด์„œ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ์ƒˆ๊ฒŒ ๋œ๋‹ค. ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์€ ๋ณด์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ return์„ ํ•ด์ค€๋‹ค.

 

3. ํ›„์ง„

๊ทธ๋ฆฌ๊ณ  4๋ฐฉํƒ์ƒ‰ํ•˜๋Š” for๋ฌธ์ด ๋๋‚˜๊ณ  ๋‹ค์Œ ์ค„๋กœ ๋„˜์–ด์™”๋‹ค๋Š” ๊ฑด 4๋ฐฉ์ด ๋‹ค ์ฐจ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ ์ด์ œ ํ›„์ง„์„ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

ํ›„์ง„ํ•˜๋Š” ๋ฐฉํ–ฅ์€ ์ œ์ผ ์ตœ๊ทผ์— ๊ฐฑ์‹ ๋œ ๋ฐฉํ–ฅ์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐ˜๋Œ€๋ฐฉํ–ฅ์œผ๋กœ dy, dx๋ฅผ ๋”ํ•œ ์ขŒํ‘œ๋กœ ์ด๋™ํ•œ๋‹ค.

๋‹จ, ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์€ ๊ฐฑ์‹ ๋œ ๋ฐฉํ–ฅ ๊ทธ๋Œ€๋กœ ๋ณธ๋‹ค. ์ด๋™๋งŒ ๋ฐ˜๋Œ€๋ฐฉํ–ฅ์œผ๋กœ ํ•ด์ค€๋‹ค.

๋ฐ˜๋Œ€๋ฐฉํ–ฅ = (๊ฐฑ์‹ ๋œ ํ˜„์žฌ ๋ฐฉํ–ฅ + 2) % 4 

 

 

3. ์ฝ”๋“œ

package BOJ;

import java.io.*;
import java.util.*;

public class BOJ_14503_๋กœ๋ด‡์ฒญ์†Œ๊ธฐ {

    static int[][] map, visited;
    static int N, M, ans, sy, sx, sd;

    static int[] dy = {-1,0,1,0};   //๋ถ๋™๋‚จ์„œ
    static int[] dx = {0,1,0,-1};

    public static void main(String[] args) throws Exception {
        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[N][M];
        visited = new int[N][M];

        st = new StringTokenizer(br.readLine());
        sy = Integer.parseInt(st.nextToken());
        sx = Integer.parseInt(st.nextToken());
        sd = Integer.parseInt(st.nextToken());

        for (int i=0; i<N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j=0; j<M; j++) {
                map[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        ans = 1;
        dfs(sy, sx, sd);
        System.out.println(ans);
    }

    static void dfs(int sy, int sx, int sd) {
        visited[sy][sx] = 1;

        for (int d=0; d<4; d++) {
            sd = (sd+3) % 4;    //ํ˜„์žฌ ๋ฐฉํ–ฅ ๊ธฐ์ค€ ๋ฐ˜์‹œ๊ณ„๋ฐฉํ–ฅ 90๋„ ํšŒ์ „ -> ๋งค ํ„ด๋งˆ๋‹ค ๋ฐ”๋€œ -> ๊ฒฐ๊ตญ ํ•œ ๋ฐ”ํ€ด
            int ny = sy+dy[sd];
            int nx = sx+dx[sd];
            if (ny<0 || ny>=N || nx<0 || nx>=M || map[ny][nx]==1 || visited[ny][nx]==1) continue;
            ans++;
            visited[ny][nx] = 1;
            dfs(ny, nx, sd);
            return; //๋ฆฌํ„ดํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด dfs ๋๋‚˜๊ณ  ๋‹ค์‹œ ๋Œ์•„์˜ค๋ฉด์„œ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ์ƒˆ๊ฒŒ ๋œ๋‹ค.
        }

        //๋„ค ๋ฐฉํ–ฅ ๋ชจ๋‘ ์ฒญ์†Œํ–ˆ์„ ๋•Œ ํ˜„์žฌ์ง€์ ์—์„œ ํ›„์ง„
        int bd = (sd+2) % 4;
        int by = sy+dy[bd];
        int bx = sx+dx[bd];
        if (by>=0 && by<N && bx>=0 && bx<M && map[by][bx]!=1) {
            dfs(by, bx, sd);
        }
    }
}

 

4. ์‚ฌ๋‹ด

๊ฐ์„ ๋˜์ฐพ์ž

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์žฌ๋ฐŒ๋‹ค..