https://www.acmicpc.net/problem/10164
10164번: 격자상의 경로
입력의 첫째 줄에는 격자의 행의 수와 열의 수를 나타내는 두 정수 N과 M(1 ≤ N, M ≤ 15), 그리고 ○로 표시된 칸의 번호를 나타내는 정수 K(K=0 또는 1 < K < N×M)가 차례로 주어지며, 각 값은 공백으
www.acmicpc.net
해석 및 팁
이 문제는 k가 0일 때와 0이 아닐 때를 구분해서 풀어야 합니다. k가 0일 때는 조건 없이 경로의 수를 개산 해주면 되고 k가 0이 아닐 때는 k까지의 범위를 2개로 나누어서 곱해주면 됩니다.
Java 코드
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int k = sc.nextInt();
int[][] arr = new int[n][m];
if(k == 0) {
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if(i == 0 || j == 0) arr[i][j] = 1;
else arr[i][j] = arr[i][j - 1] + arr[i - 1][j];
}
}
System.out.println(arr[n - 1][m - 1]);
}
else {
int midx = (k - 1) / m;
int midy = (k - 1) % m;
for(int i = 0; i <= midx; i++) {
for(int j = 0; j <= midy; j++) {
if(i == 0 || j == 0) arr[i][j] = 1;
else arr[i][j] = arr[i][j - 1] + arr[i - 1][j];
}
}
int a = arr[midx][midy];
for(int i = midx; i < n; i++) {
for(int j = midy; j < m; j++) {
if(i == midx || j == midy) arr[i][j] = 1;
else arr[i][j] = arr[i][j - 1] + arr[i - 1][j];
}
}
int b = arr[n - 1][m - 1];
System.out.println(a * b);
}
}
}
'백준' 카테고리의 다른 글
백준 3049 다각형의 대각선(Java) (0) | 2023.02.21 |
---|---|
백준 1747 소수&펠린드롬(Java) (0) | 2023.02.21 |
백준 2343 기타 레슨(Java) (0) | 2023.02.21 |
백준 5555 반지(Java) (0) | 2023.02.21 |
백준 10709 기상캐스터(Java) (0) | 2023.02.21 |