Skip to content

Conversation

@KangHyojin1401
Copy link
Contributor

@KangHyojin1401 KangHyojin1401 commented Jun 16, 2023

문제출처 문제번호: 문제이름

  • 메모리: 15436KB
  • 시간 : 356ms

🚩 설계

그냥 생각나는 게 dfs로 완탐 돌리는 거 밖에 없어서 일단 짜고 봤다.

그리고 0이 가로, 1이 세로, 2가 대각선으로 치고,
이동 후의 모든 경우의 수에 대해 파이프에서 가장 우측 하단 칸의 delta값을 배열로 뒀음.

✅ 후기

역시나 중복되는 게 많아서 dp로 뭔가 될 거 같더니 남의 코드 보니까 dp로 풀었음. 시간은 반토막

int[][] horizontalDp = new int[N][N];
int[][] verticalDp = new int[N][N];
int[][] diagonalDp = new int[N][N];

// 1행 가로 방향
for (int i = 1; i < N; i++) {
  if (map[0][i]) {
    horizontalDp[0][i] = 1;
  } else {
    break;
  }
}

// 1행 세로 / 대각 -> 0
// 1열 가로 / 세로 / 대각 -> 0
for (int i = 1; i < N; i++) {
  for (int j = 1; j < N; j++) {
    if (!map[i][j]) continue;
    // 가로 방향
    horizontalDp[i][j] = horizontalDp[i][j - 1] + diagonalDp[i][j - 1];

    // 세로 방향
    verticalDp[i][j] = verticalDp[i - 1][j] + diagonalDp[i - 1][j];

    // 대각 방향
    if (map[i - 1][j] && map[i][j - 1]) {
      diagonalDp[i][j] = horizontalDp[i - 1][j - 1] + verticalDp[i - 1][j - 1] + diagonalDp[i - 1][j - 1];
    }
  }
}

int answer = horizontalDp[N - 1][N - 1] +
    verticalDp[N - 1][N - 1] +
    diagonalDp[N - 1][N - 1];

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant