Algorithm

[백준] 10164 격자상의 경로 Python

YunSeong 2021. 8. 2. 21:09
728x90
반응형

 

 

https://www.acmicpc.net/problem/10164

 

10164번: 격자상의 경로

입력의 첫째 줄에는 격자의 행의 수와 열의 수를 나타내는 두 정수 N과 M(1 ≤ N, M ≤ 15), 그리고 ○로 표시된 칸의 번호를 나타내는 정수 K(K=0 또는 1 < K < N×M)가 차례로 주어지며, 각 값은 공백으

www.acmicpc.net

1. 문제 

이 문제는 N, M, K의 값을 받아서 N * M개의 칸을 가진 격자를 만들고 왼쪽에서 오른쪽으로 위에서 아래로 넘버링을 한다. 

그 다음 K가 0일 때는 1번 칸에서 N * M번 칸까지 격자의 변을 통해서만 이동하는 경우의 수를 구하고 

K가 0이 아닐 때는 K번 칸을 무조건 지나도록 갈 때의 경우의 수를 구하는 것이다. 

 

자세한 문제는 위 링크 안에 있다. 

 

2. 풀이

이 문제를 보자마자 이산수학에서의 최단경로의 수 문제가 생각이 났다.

x, y축으로 M, N칸을 가야할 때

(M+N)!/(N! * M!)를 통해서 경우의 수를 구하는 것이다.

 

 

1
2
3
4
5
6
def factorial(N) :
    if N >= 2 :
        return N*factorial(N-1)
    else :
        return 1
 
cs

그것을 이용하기 위해서 일단 위의 코드 같이 재귀함수를 이용해서 factorial 함수를 만들었다. 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
N, M, K = input().split(" ")
N, M, K = int(N), int(M), int(K)
 
if K == 0 :
    print(round(factorial(N + M - 2/ (factorial(N-1* factorial(M-1))))
else :
    if K%M > 0 :
        y = (K//+ 1)
    else :
        y = (K//M)
    x = K - ((y-1* M)
    print(round((factorial(x+y-2/ (factorial(x-1* factorial(y-1)))*(factorial(M - x + N - y) / (factorial(M - x) * factorial(N - y)))))
cs

1~2에서 N, M, K를 입력 받고 정수의 형태로 저장했다. 

 

4~5에서 K가 0일 때 1번 칸에서 M*N번 칸까지 갈 때 x축으로 M-1칸 y축으로 N-1칸을 가야하기에

(M+N-1)!/((M-1)!*(N-1)!)을 출력하도록 했다. 

 

7~11에서 K번째 칸의 x, y 좌표를 얻었다. 

 

12에서 K번 칸의 좌표를 이용해서 계산한 값을 출력하도록 했다. 

 

 

728x90
반응형

'Algorithm' 카테고리의 다른 글

[백준] 1309 동물원 Python  (0) 2021.08.08
[백준] 16953 A to B Python, 깊은 복사  (0) 2021.08.02