• Home

My Codegate

  • Home

백준 26170 사과 빨리 먹기 자바 문제풀이

2024/01/08 Posted by Codegate Java No Comments

문제 링크

문제 내용은 5×5 크기의 값을 받아서 지도로 사용해야 하는데, 6번째 입력으로 받은 두 값을 시작 위치로 한 뒤, 해당 위치에서 출발해서 1에 해당하는 사과 3개를 먹는 최소 이동 횟수를 구해야 한다.

만약 사과 3개를 구하지 못했다면 -1을 출력해주면 된다. 여기서 주의할 점은 지나온 길은 다시 되돌아갈 수 없고, -1의 경우에는 아예 지나갈 수 없다

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

public class Main {

  static int[][] arr = new int[5][5];
  static boolean status;
  static int ans;

  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    for (int i = 0; i < 5; i++) {
      int[] split = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
      System.arraycopy(split, 0, arr[i], 0, 5);
    }

    int[] start = Arrays.stream(br.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
    boolean[][] visited = new boolean[5][5];
    dfs(start[0], start[1], visited, 0, 0);

    if (status) {
      System.out.println(ans);
    } else {
      System.out.println(-1);
    }

  }

  public static void dfs(int i, int j, boolean[][] visited, int count, int apple) {
    visited[i][j] = true;
    if (arr[i][j] == 1) {
      apple = apple + 1;
    }

    if (apple >= 3) {
      status = true;
      if (ans == 0) {
        ans = count;
      } else {
        ans = Math.min(ans, count);
      }
      return;
    }

    if (i + 1 < 5) {
      if (arr[i + 1][j] != -1 && !visited[i + 1][j]) {
        dfs(i + 1, j, visited, count + 1, apple);
        visited[i + 1][j] = false;
      }
    }

    if (i - 1 > -1) {
      if (arr[i - 1][j] != -1 && !visited[i - 1][j]) {
        dfs(i - 1, j, visited, count + 1, apple);
        visited[i - 1][j] = false;
      }
    }

    if (j + 1 < 5) {
      if (arr[i][j + 1] != -1 && !visited[i][j + 1]) {
        dfs(i, j + 1, visited, count + 1, apple);
        visited[i][j + 1] = false;
      }
    }

    if (j - 1 > -1) {
      if (arr[i][j - 1] != -1 && !visited[i][j - 1]) {
        dfs(i, j - 1, visited, count + 1, apple);
        visited[i][j - 1] = false;
      }
    }
  }

}

문제를 풀어보자면 2차원 배열에 입력받은 5줄을 모두 넣어준 후, DFS를 이용해 문제를 풀어줘야 하는데, 시작점은 마지막 입력받은 두 값을 가지고 배치해주면 되고, 시작점부터 동서남북으로 움직이되 사과 세 개를 찾으면 따로 boolean에 true 처리 해 주고 사과 값을 출력한 변수에 넣어주자.

처음 사과 세 개를 발견 시 무조건 넣어주면 되지만, 결국 최소 횟수를 출력해야 하기 때문에 이후부터는 Math.min을 사용해서 사과 3개를 모은 경우 중 횟수가 적은 경우를 저장해주면 된다.

모두 찾지 못했을 경우에는 따로 걱정할 필요가 없는게, 애초에 DFS 다 돌렸는데 구하지 못했으면 boolean 값이 변하지 않고 false로 남아 있었을 것이기 때문에 -1을 반환해주면 끝이다

No Comments
0

Leave a Reply Cancel Reply

Introduction

My Codegate

Latest Posts

  • Google Search Console API 연동방법
  • 인텔리제이 Gradle Dependency 최신 버전 보는 방법
  • Wallet-Tracker 개발일지
  • Moralis API 자바로 호출방법
  • IntelliJ Commit 후 Push 따로 하는 방법

Categories

  • My Project (4)
  • Java (42)
  • Algorithm (161)
    • Java (152)
    • Algorithm Knowledge (3)
    • Algorithm site usage (6)
  • Vue.js (1)
  • Spring (4)
  • Docker (2)
  • IntelliJ (20)
  • Uncategorized (7)

Recent Comments

  • Codegate on Hello world!
  • A WordPress Commenter on Hello world!

© 2025 — mycodegate.com

Prev Next