J

[JAVA] BOJ ๋ฐฑ์ค€ 14503 ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ ๋ณธ๋ฌธ

๐Ÿ”‘ Problem Solving/๐Ÿ’ป Samsung SW Expert

[JAVA] BOJ ๋ฐฑ์ค€ 14503 ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ

snowball๐Ÿฐ 2023. 1. 28. 17:40

๋ฌธ์ œ

๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ฒญ์†Œํ•˜๋Š” ์˜์—ญ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์žˆ๋Š” ์žฅ์†Œ๋Š” N×M ํฌ๊ธฐ์˜ ์ง์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, 1×1ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ์นธ์€ ๋ฒฝ ๋˜๋Š” ๋นˆ ์นธ์ด๋‹ค. ์ฒญ์†Œ๊ธฐ๋Š” ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์ด ์žˆ์œผ๋ฉฐ, ์ด ๋ฐฉํ–ฅ์€ ๋™, ์„œ, ๋‚จ, ๋ถ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ์ง€๋„์˜ ๊ฐ ์นธ์€ (r, c)๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๊ณ , r์€ ๋ถ์ชฝ์œผ๋กœ๋ถ€ํ„ฐ ๋–จ์–ด์ง„ ์นธ์˜ ๊ฐœ์ˆ˜, c๋Š” ์„œ์ชฝ์œผ๋กœ ๋ถ€ํ„ฐ ๋–จ์–ด์ง„ ์นธ์˜ ๊ฐœ์ˆ˜์ด๋‹ค.

→ ์ด๋ฅผ ํ†ตํ•ด ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์ˆ˜ ์žˆ๋‹ค.

๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•œ๋‹ค.

  1. ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ฒญ์†Œํ•œ๋‹ค.
  2. ํ˜„์žฌ ์œ„์น˜์—์„œ ํ˜„์žฌ ๋ฐฉํ–ฅ์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ๋ฐฉํ–ฅ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•œ๋‹ค.
    1. ์™ผ์ชฝ ๋ฐฉํ–ฅ์— ์•„์ง ์ฒญ์†Œํ•˜์ง€ ์•Š์€ ๊ณต๊ฐ„์ด ์กด์žฌํ•œ๋‹ค๋ฉด, ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ํ•œ ๋‹ค์Œ ํ•œ ์นธ์„ ์ „์ง„ํ•˜๊ณ  1๋ฒˆ๋ถ€ํ„ฐ ์ง„ํ–‰ํ•œ๋‹ค.
    2. ์™ผ์ชฝ ๋ฐฉํ–ฅ์— ์ฒญ์†Œํ•  ๊ณต๊ฐ„์ด ์—†๋‹ค๋ฉด, ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ํ•˜๊ณ  2๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค.
    3. ๋„ค ๋ฐฉํ–ฅ ๋ชจ๋‘ ์ฒญ์†Œ๊ฐ€ ์ด๋ฏธ ๋˜์–ด์žˆ๊ฑฐ๋‚˜ ๋ฒฝ์ธ ๊ฒฝ์šฐ์—๋Š”, ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์„ ์œ ์ง€ํ•œ ์ฑ„๋กœ ํ•œ ์นธ ํ›„์ง„์„ ํ•˜๊ณ  2๋ฒˆ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค.
    4. ๋„ค ๋ฐฉํ–ฅ ๋ชจ๋‘ ์ฒญ์†Œ๊ฐ€ ์ด๋ฏธ ๋˜์–ด์žˆ๊ฑฐ๋‚˜ ๋ฒฝ์ด๋ฉด์„œ, ๋’ค์ชฝ ๋ฐฉํ–ฅ์ด ๋ฒฝ์ด๋ผ ํ›„์ง„๋„ ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์ž‘๋™์„ ๋ฉˆ์ถ˜๋‹ค.

๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๋Š” ์ด๋ฏธ ์ฒญ์†Œ๋˜์–ด์žˆ๋Š” ์นธ์„ ๋˜ ์ฒญ์†Œํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฒฝ์„ ํ†ต๊ณผํ•  ์ˆ˜ ์—†๋‹ค.

→ ์‚ผ์„ฑ ๊ธฐ์ถœ๋ฌธ์ œ๋Š” ๋ฌธ์ œ์—์„œ ์ œ์‹œ๋œ ์ƒํ™ฉ๋Œ€๋กœ ํ•ด์•ผํ•œ๋‹ค! ์ž„์˜๋กœ ์ƒํ™ฉ์„ ๋ฐ”๊พธ์–ด ํ•จ์ˆ˜๋ฅผ ์‹œํ–‰ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋‚  ๋•Œ ์ด์œ ๋ฅผ ์ฐพ๊ธฐ ์–ด๋ ต๋‹ค

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์„ธ๋กœ ํฌ๊ธฐ N๊ณผ ๊ฐ€๋กœ ํฌ๊ธฐ M์ด ์ฃผ์–ด์ง„๋‹ค. (3 ≤ N, M ≤ 50)

๋‘˜์งธ ์ค„์— ๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์˜ ์ขŒํ‘œ (r, c)์™€ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ d๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. d๊ฐ€ 0์ธ ๊ฒฝ์šฐ์—๋Š” ๋ถ์ชฝ์„, 1์ธ ๊ฒฝ์šฐ์—๋Š” ๋™์ชฝ์„, 2์ธ ๊ฒฝ์šฐ์—๋Š” ๋‚จ์ชฝ์„, 3์ธ ๊ฒฝ์šฐ์—๋Š” ์„œ์ชฝ์„ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

→ ๋ถ : 0, ๋™ : 1, ๋‚จ: 2, ์„œ: 3, ์ด๋•Œ ๋ถ์ชฝ์˜ ์™ผ์ชฝ ๋ฐฉํ–ฅ ์ „์ง„์€ ๋™์ชฝ์œผ๋กœ ํ–ฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์„œ์ชฝ์œผ๋กœ ํ–ฅํ•˜๋Š” ๊ฒƒ์ž„์„ ์•Œ์•„์•ผ ํ•œ๋‹ค.

์…‹์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ์žฅ์†Œ์˜ ์ƒํƒœ๊ฐ€ ๋ถ์ชฝ๋ถ€ํ„ฐ ๋‚จ์ชฝ ์ˆœ์„œ๋Œ€๋กœ, ๊ฐ ์ค„์€ ์„œ์ชฝ๋ถ€ํ„ฐ ๋™์ชฝ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ๋นˆ ์นธ์€ 0, ๋ฒฝ์€ 1๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ง€๋„์˜ ์ฒซ ํ–‰, ๋งˆ์ง€๋ง‰ ํ–‰, ์ฒซ ์—ด, ๋งˆ์ง€๋ง‰ ์—ด์— ์žˆ๋Š” ๋ชจ๋“  ์นธ์€ ๋ฒฝ์ด๋‹ค.

๋กœ๋ด‡ ์ฒญ์†Œ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์˜ ์ƒํƒœ๋Š” ํ•ญ์ƒ ๋นˆ ์นธ์ด๋‹ค.

์ฝ”๋“œ

์ „์ฒด ์ฝ”๋“œ

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

public class BOJ_14503 {
    static int N;
    static int M;
    static int[][] home;
    static int result;
    static int rx;
    static int ry;
    static int rd;
    static int check;

    public static void main(String[] args) throws Exception {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        home = new int[N][M];
        st = new StringTokenizer(bf.readLine(), " ");
        rx = Integer.parseInt(st.nextToken());
        ry = Integer.parseInt(st.nextToken());
        rd = Integer.parseInt(st.nextToken());
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(bf.readLine(), " ");
            for (int j = 0; j < M; j++)
                home[i][j] = Integer.parseInt(st.nextToken());
        }
        clean();
        sb.append(result);
        System.out.println(sb.toString());
    }

    static void clean() {
        int[][] visited = new int[N][M];
        int[] dx = { 0, -1, 0, 1 };
        int[] dy = { -1, 0, 1, 0 };

        while (true) {
            int nx, ny;
            if (visited[rx][ry] == 0) {
                visited[rx][ry] = 1;
                result++;
            } // 1๋ฒˆ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ฒญ์†Œํ•œ๋‹ค.
            if (check == 4) {
                if (rd < 1) {
                    nx = rx + dx[3];
                    ny = ry + dy[3];
                } else {
                    nx = rx + dx[rd - 1];
                    ny = ry + dy[rd - 1];
                }
                if (nx < 0 || ny < 0 || nx >= N || ny >= M || home[nx][ny] == 1)
                    return;
                else {
                    rx = nx;
                    ry = ny;
                    check = 0;
                }
            }
            nx = rx + dx[rd];
            ny = ry + dy[rd];

            if (nx >= 0 && ny >= 0 && nx < N && ny < M && visited[nx][ny] != 1 && home[nx][ny] != 1) {
                rx = nx;
                ry = ny;
                check = 0;
            } else
                check++;
            rd--;
            if (rd < 0)
                rd = 3;
        }

    }
}

์ˆœ์„œ๋Œ€๋กœ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž!

static int N;
static int M;
static int[][] home;
static int result;
static int rx;
static int ry;
static int rd;
static int check;

๋‹ค์Œ ๋ณ€์ˆ˜๋“ค์€ ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ๋ณ€์ˆ˜๋“ค์ด๋‹ค.

home ๋ฐฐ์—ด์€ ์ฒ˜์Œ ์ž…๋ ฅ๋ฐ›์€ ๊ตฌ์—ญ์„ ๋‹ด์€ ๋ฐฐ์—ด์ด๋‹ค.

rx, ry, rd๋Š” ๊ฐ๊ฐ ๋กœ๋ด‡์˜ ํ˜„์žฌ ์œ„์น˜์™€ ๋ฐฉํ–ฅ์„ ๋‹ด์€ ๋ณ€์ˆ˜์ด๋‹ค.

check ๋ณ€์ˆ˜๋Š” ๋กœ๋ด‡์ด ํ˜„์žฌ ์œ„์น˜์—์„œ 4 ๋ฐฉํ–ฅ ์ค‘ ๋ช‡๊ฐœ์˜ ๋ฐฉํ–ฅ์„ ํ™•์ธํ–ˆ๋Š”์ง€๋ฅผ ๋‹ด์€ ๋ณ€์ˆ˜์ด๋‹ค.

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
home = new int[N][M];
st = new StringTokenizer(bf.readLine(), " ");
rx = Integer.parseInt(st.nextToken());
ry = Integer.parseInt(st.nextToken());
rd = Integer.parseInt(st.nextToken());
for (int i = 0; i < N; i++) {
	st = new StringTokenizer(bf.readLine(), " ");
	for (int j = 0; j < M; j++)
	home[i][j] = Integer.parseInt(st.nextToken());
}
clean();
sb.append(result);
System.out.println(sb.toString());

BufferedReader๋ฅผ ํ†ตํ•ด ์ž…๋ ฅ์„ ๋ฐ›๊ณ  StringBuilder๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

์ด๋•Œ clean ํ•จ์ˆ˜์—์„œ ์ฒญ์†Œ๊ฐ€ ์ด๋ฃจ์–ด์ง€๊ณ  ๊ฒฐ๊ณผ๊ฐ’์€ result ๋ณ€์ˆ˜์— ๋‹ด๊ฒจ์ง„๋‹ค.

static void clean() {
        int[][] visited = new int[N][M];
        int[] dx = { 0, -1, 0, 1 };
        int[] dy = { -1, 0, 1, 0 };

visited ๋ฐฐ์—ด์€ ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ฒญ์†Œ ํ–ˆ๋Š”์ง€์˜ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์„ ๋‹ด์€ ๋ฐฐ์—ด์ด๋‹ค.

dx, dy ๋ฐฐ์—ด์€ ๋ถ, ๋™, ๋‚จ, ์„œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆซ์ž๋ฅผ ์ธ๋ฑ์Šค ๊ฐ’์œผ๋กœ ๋ฐ›์•˜์„ ๋•Œ ๊ทธ ๋ฐฉํ–ฅ์˜ ์™ผ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ์ „์ง„ํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐฐ์—ด์ด๋‹ค.

์ฆ‰, rx += dx[๋ถ], ry += dy[๋ถ]์„ ํ•˜๊ฒŒ ๋˜๋ฉด ๋กœ๋ด‡์€ ๋ถ์ชฝ์„ ๋ฐ”๋ผ๋ดค์„ ๋•Œ์˜ ์™ผ์ชฝ๋ฐฉํ–ฅ์ธ ๋™์ชฝ์œผ๋กœ ํ•œ์นธ ์ „์ง„ํ•˜๊ฒŒ ๋œ๋‹ค.

while (true) {
    int nx, ny;
    if (visited[rx][ry] == 0) {
          visited[rx][ry] = 1;
          result++;
    }

while ๋ฌธ์„ ํ†ตํ•ด 2-4์— ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ์šฐ loop๋ฅผ ๋น ์ ธ๋‚˜์˜ค๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด true๋ฅผ ์จ์ฃผ์—ˆ๋‹ค.

nx, ny ๋ณ€์ˆ˜๋Š” ํ™•์ธํ•  ์œ„์น˜๋ฅผ ๋‹ด์€ ๋ณ€์ˆ˜์ด๋‹ค.

๋‹ค์Œ์˜ if๋ฌธ์€ 1๋ฒˆ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค. ํ•ด๋‹น ์œ„์น˜๊ฐ€ ์ฒญ์†Œ๊ฐ€ ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ฒญ์†Œ๋ฅผ ํ•ด์ฃผ๊ณ  ๊ฒฐ๊ณผ๊ฐ’์„ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

if (check == 4) {
        if (rd < 1) {
              nx = rx + dx[3];
              ny = ry + dy[3];
         } else {
               nx = rx + dx[rd - 1];
               ny = ry + dy[rd - 1];
         }
         if (nx < 0 || ny < 0 || nx >= N || ny >= M || home[nx][ny] == 1)
              return;
          else {
               rx = nx;
               ry = ny;
               check = 0;
           }
       }

๋‹ค์Œ if๋ฌธ์€ 2-3,4๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

check๊ฐ€ 4์ด๋ฏ€๋กœ ํ˜„์žฌ ์œ„์น˜์—์„œ ๋„ค ๋ฐฉํ–ฅ์„ ๋ชจ๋‘ ํƒ์ƒ‰ํ•˜์˜€๊ณ  ๋„ค ๋ฐฉํ–ฅ ๋ชจ๋‘ ์ฒญ์†Œ๊ฐ€ ์ด๋ฏธ ๋˜์—ˆ๊ฑฐ๋‚˜ ๋ฒฝ์ธ ๊ฒฝ์šฐ์ด๋‹ค. ์ด๋•Œ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์„ ์œ ์ง€ํ•œ ์ฑ„(rd๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์€ ์ฑ„) ํ•œ ์นธ ํ›„์ง„์„ ํ•ด์•ผํ•œ๋‹ค.

rd๋ฅผ -2, +2๋ฅผ ํ•˜์ง€ ์•Š๊ณ  -1์„ ํ•˜๋Š” ์ด์œ ๋Š” ํ˜„์žฌ ์ธ๋ฑ์Šค๋ฅผ ๋„ฃ์—ˆ์„ ๋•Œ ์™ผ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ์ „์ง„ํ•˜๊ฒŒ ๋˜์–ด์žˆ์œผ๋ฏ€๋กœ -1์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

nx, ny๊ฐ€ ์นธ์„ ๋ฒ—์–ด๋‚ฌ๊ฑฐ๋‚˜ ๋ฒฝ์ธ ๊ฒฝ์šฐ์—๋Š” ์ž‘๋™์„ ๋ฉˆ์ถ˜๋‹ค. → return

๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ํ›„์ง„์„ ํ•˜๊ณ  ์ƒˆ๋กœ์šด ์œ„์น˜๋กœ ์ด๋™ํ–ˆ์œผ๋ฏ€๋กœ check๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค. → ๋กœ๋ด‡์˜ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค

nx = rx + dx[rd];
ny = ry + dy[rd];

if (nx >= 0 && ny >= 0 && nx < N && ny < M && visited[nx][ny] != 1 && home[nx][ny] != 1) {
    rx = nx;
    ry = ny;
    check = 0;
} else
    check++;
rd--;
if (rd < 0)
    rd = 3;

๋‹ค์Œ์€ 2-1,2๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

nx, ny๋ฅผ ํ˜„์žฌ ๋ฐฉํ–ฅ์˜ ์™ผ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ํ•œ์นธ ์ „์ง„ํ•œ ์œ„์น˜๋กœ ์ง€์ •ํ•œ๋‹ค.

์ด๋•Œ ์ด ์ด๋™ํ•  ์œ„์น˜๊ฐ€ ์นธ์—์„œ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๊ณ  ์ฒญ์†Œํ•˜์ง€ ์•Š์•˜๊ณ  ๋ฒฝ๋„ ์•„๋‹ˆ๋ผ๋ฉด ์ด๋™ํ•œ๋‹ค. ๋˜ํ•œ ์ƒˆ๋กœ์šด ์œ„์น˜์— ๋„๋‹ฌํ–ˆ์œผ๋ฏ€๋กœ check๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค. → rx, ry๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค.

์ฒญ์†Œ๊ฐ€ ๋˜์–ด์žˆ๊ฑฐ๋‚˜ ๋ฒฝ์ธ ๊ฒฝ์šฐ → check๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ์™ผ์ชฝ์œผ๋กœ ํšŒ์ „ํ•ด์•ผ ํ•˜๋ฏ€๋กœ rd๋ฅผ ํ•˜๋‚˜ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

์ด๋•Œ rd๊ฐ€ 0๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ(-1) ์ธ๋ฑ์Šค ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๊ฒŒ ๋˜๋ฏ€๋กœ 3์œผ๋กœ ๊ฐ’์„ ๋ฐ”๊พธ์–ด ์ค€๋‹ค.

Comments