JuSeok

17070번

문제

  • 파이프를 배열 끝으로 이동시키는 문제
문제 해결 순서
  1. 맨 처음 입력받은 숫자로 2차원 배열 arr을 초기화 (파이프 끝 부분만 생각하면 된다는 점이 포인트)
  2. 재귀함수 search()를 만들어 각각의 조건에 맞으면 다시 search()를 호출
  3. isEscape()함수를 통해 좌표값이 배열을 벗어나는지
import java.util.Scanner;

class Main {
  // 전역변수 선언
  public static int answer;
  public static int n;
  public static int arr[][];

  public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    // 전역변수 초기화
    answer = 0;
    n = scan.nextInt();
    arr = new int[n][n];

    // 배열 초기화
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        arr[i][j] = scan.nextInt();
      }
    }

    search(0, 1, 0);
    System.out.print(answer);
  }

  public static void search(int i, int j, int d) {

    // (i, j)가 (n-1, n-1) 이라면 통과
    if (i == n - 1 && j == n - 1) {
      answer++;
      return;
    }
    // 파이프가 가로일때
    if(d == 0){
      if (isEscape(i, j + 1) && arr[i][j + 1] == 0) {
        search(i, j + 1, 0);
      }
      if (isEscape(i + 1, j + 1) && arr[i][j + 1] == 0 && arr[i + 1][j] == 0 && arr[i + 1][j + 1] == 0) {
        search(i + 1, j + 1, 2);
      }
    }
    // 파이프가 세로일때
    else if(d == 1){
      if (isEscape(i + 1, j) && arr[i + 1][j] == 0) {
        search(i + 1, j, 1);
      }
      if (isEscape(i + 1, j + 1) && arr[i][j + 1] == 0 && arr[i + 1][j] == 0 && arr[i + 1][j + 1] == 0) {
        search(i + 1, j + 1, 2);
      }
    }
    // 파이프가 대각선일때
    else if(d == 2){
      if (isEscape(i + 1, j) && arr[i + 1][j] == 0) {
        search(i + 1, j, 1);
      }
      if (isEscape(i + 1, j + 1) && arr[i][j + 1] == 0 && arr[i + 1][j] == 0 && arr[i + 1][j + 1] == 0) {
        search(i + 1, j + 1, 2);
      }
      if (isEscape(i, j + 1) && arr[i][j + 1] == 0) {
        search(i, j + 1, 0);
      }
    }
  }

  // 배열을 벗어났는지 확인하는 함수
  public static boolean isEscape(int i, int j) {
    if(i >= 0 && i < n && j >= 0 && j < n){
      return true;
    }
    return false;
  }
}

Tags