[JAVA] 백준 26169번 : 세 번 이내에 사과를 먹자

2025. 6. 10. 12:14·Algorithm

[26169번 : 세 번 이내에 사과를 먹자] - Silver3


[ 문제 ]

5 x 5 크기의 보드가 주어진다. 보드는 1 x 1 크기의 정사각형 격자로 이루어져 있다. 보드의 격자는 사과가 1개 있는 격자, 장애물이 있는 격자, 빈칸으로 되어 있는 격자로 구분된다. 격자의 위치는 (r, c)로 표시한다. r은 행 번호, c는 열 번호를 나타낸다. 행 번호는 맨 위 위치가 0이고 아래 방향으로 1씩 증가한다. 열 번호는 맨 왼쪽 위치가 0이고 오른쪽으로 1씩 증가한다. 즉, 맨 왼쪽 위 위치가 (0, 0), 맨 아래 오른쪽 위치가 (4, 4)이다.

 

현재 한 명의 학생이 (r, c) 위치에 있고 한 번의 이동으로 상, 하, 좌, 우 방향 중에서 한가지 방향으로 한 칸 이동할 수 있다. 학생이 사과가 있는 칸으로 이동하면 해당 칸에 있는 사과를 1개 먹는다. 장애물이 있는 칸으로는 이동할 수 없다. 학생이 지나간 칸은 학생이 해당 칸을 떠나는 즉시 장애물이 있는 칸으로 변경된다. 즉, 학생이 해당 칸에서 상, 하, 좌, 우 방향으로 한 칸 이동하는 즉시 해당 칸은 장애물이 있는 칸으로 변경된다.

 

학생이 현재 위치 (r, c)에서 세 번 이하의 이동으로 사과를 2개 이상 먹을 수 있으면 1을 출력하고, 그렇지 않으면 0을 출력하자.


[ 입력 ]

첫 번째 줄부터 다섯 개의 줄에 걸쳐 보드의 정보가 주어진다. i번째 줄의 j번째 수는 보드의 (i - 1)번째 행, (j - 1)번째 열의 정보를 나타낸다. 보드의 정보가 1이면 해당 칸은 사과가 1개 있는 격자임을 나타내고, 0이면 빈칸이 있는 격자를 나타내고, -1이면 장애물이 있는 격자임을 나타낸다.

 

다음 줄에 학생의 현재 위치 r, c가 빈칸을 사이에 두고 순서대로 주어진다.

 

  • 0 ≤ r, c ≤ 4
  • 현재 위치 (r, c)는 빈칸이다.

[ 출력 ]

첫 번째 줄에 학생이 현재 위치 (r, c)에서 세 번 이하의 이동으로 사과를 2개 이상 먹을 수 있으면 1을 출력하고, 먹을 수 없으면 0을 출력한다.

 

# 예제 입력 1
0 0 1 0 0
0 0 -1 0 0
0 0 1 0 0
1 1 -1 1 0
0 0 0 -1 0
4 1

# 예제 출력 1
1

[ Code ]

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Main {
    static class Node {
        int y, x;

        public Node(int y, int x) {
            this.y = y;
            this.x = x;
        }
    }

    static boolean flag = false;
    static int[][] arr;
    static boolean[][] visited;
    static int[] dy = {-1, 1, 0, 0};
    static int[] dx = {0, 0, -1, 1};
    static List<Node> result = new ArrayList<>();

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        arr = new int[5][5];
        visited = new boolean[5][5];

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

        StringTokenizer st = new StringTokenizer(br.readLine());
        int r = Integer.parseInt(st.nextToken());
        int c = Integer.parseInt(st.nextToken());
        result.add(new Node(r, c));
        visited[r][c] = true;

        back(r, c);
        bw.write(flag ? "1" : "0");
        bw.close();
    }

    static void back(int y, int x) {
        if (flag) {
            return;
        }

        if (result.size() == 4) {
            int apple = 0;
            for (Node cur : result) {
                if (arr[cur.y][cur.x] == 1) {
                    apple += 1;
                }
            }

            if (apple >= 2) {
                flag = true;
            }
            return;
        }

        for (int i = 0; i < 4; i++) {
            int moveY = y + dy[i];
            int moveX = x + dx[i];
            boolean wall = false;

            if (isValid(moveY, moveX) && arr[moveY][moveX] != -1 && !visited[moveY][moveX]) {
                if (arr[moveY][moveX] == 0) {
                    arr[moveY][moveX] = -1;
                    wall = true;
                }

                visited[moveY][moveX] = true;
                result.add(new Node(moveY, moveX));
                back(moveY, moveX);
                result.remove(result.size() - 1);
                visited[moveY][moveX] = false;

                if (wall) {
                    arr[moveY][moveX] = 0;
                }
            }
        }
    }

    static boolean isValid(int y, int x) {
        return y >= 0 && x >= 0 && y < 5 && x < 5;
    }
}
반응형

'Algorithm' 카테고리의 다른 글

[JAVA] 백준 16918번 : 봄버맨  (1) 2025.06.27
[JAVA] 백준 2015번 : 수들의 합 4  (0) 2025.06.13
[JAVA] 백준 1744번 : 수 묶기  (0) 2025.06.03
[JAVA] 백준 16929번 : Two Dots  (0) 2025.06.03
[JAVA] 백준 2023번 : 신기한 소수  (0) 2025.05.29
'Algorithm' 카테고리의 다른 글
  • [JAVA] 백준 16918번 : 봄버맨
  • [JAVA] 백준 2015번 : 수들의 합 4
  • [JAVA] 백준 1744번 : 수 묶기
  • [JAVA] 백준 16929번 : Two Dots
ssu_dev
ssu_dev
  • ssu_dev
    ssu
    ssu_dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (98)
      • Cloud (10)
      • HCI (2)
      • Algorithm (54)
      • Programming (13)
      • Computer Science (5)
      • System (6)
      • Trouble Shooting (6)
      • Work (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 인기 글

  • 태그

    OS
    구현
    EKS
    BOJ
    Stack
    플로이드 워셜
    자료구조
    bfs
    node scaling
    Pod Scheduling
    sort
    docker
    priorityqueue
    Karpenter
    cs
    dfs
    Java
    K8s
    Deque
    투포인터
  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
ssu_dev
[JAVA] 백준 26169번 : 세 번 이내에 사과를 먹자
상단으로

티스토리툴바