[Project Euler #15][C++] 20×20 격자의 좌상단에서 우하단으로 가는 경로의 수
Problem Solving/Project Euler 2020. 12. 28. 02:31728x90
728x170
문제15 : 20×20 격자의 좌상단에서 우하단으로 가는 경로의 수
문제
아래와 같은 2 × 2 격자의 왼쪽 위 모서리에서 출발하여 오른쪽 아래 모서리까지 도달하는 길은 모두 6가지가 있습니다 (거슬러 가지는 않기로 합니다).
그러면 20 × 20 격자에는 모두 몇 개의 경로가 있습니까?
문제 해결 방법
- 격자에서 최단 경로의 수 를 찾는 문제이다.
- 규칙성을 찾아 문제를 해결하였다.
- 배열
ary[20][20]
에서ary[n][n] = ary[n - 1][n] + ary[n][n - 1]
이다.
- 배열
for
문을 사용하여ary[x][0]
과ary[0][x]
의 값을 모두1
로 설정하였다.- 그리고 또 다른
for
문을 사용하여 찾은 규칙성을 바탕으로 배열에 값을 채워서 최종적으로ary[SIZE][SIZE]
에 있는 값이 출력되도록 하였다.
5 x 5 격자에서의 최단 경로의 수
0 1 1 1 1 1 1 2(1+1) 3 4 5 6 1 3 6(3+3) 10 15 21 1 4 10 20(10+10) 35 56 1 5 15 35 70(35+35) 126 1 6 21 56 126 252(126+126)
소스 코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <iomanip> //setw() | |
using namespace std; | |
#define SIZE 20 // 20 x 20 | |
#define WIDTH 11 // 출력 너비 | |
int main() { | |
unsigned long long int ary[SIZE + 1][SIZE + 1] = {0}; | |
for (int i = 1; i <= SIZE; i++) { | |
ary[0][i] = 1; | |
ary[i][0] = 1; | |
} | |
for (int i = 1; i <= SIZE; i++) { | |
for (int j = 1; j <= SIZE; j++) { | |
ary[i][j] = ary[i - 1][j] + ary[i][j - 1]; | |
} | |
} | |
// 출력 | |
for (int i = 0; i <= SIZE; i++) { | |
for (int j = 0; j <= SIZE; j++) { | |
cout << setw(WIDTH) << ary[i][j] << " "; | |
} | |
cout << endl; | |
} | |
cout << ary[SIZE][SIZE] << endl; | |
return 0; | |
} |
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 153 171 190 210 231 1 4 10 20 35 56 84 120 165 220 286 364 455 560 680 816 969 1140 1330 1540 1771 1 5 15 35 70 126 210 330 495 715 1001 1365 1820 2380 3060 3876 4845 5985 7315 8855 10626 1 6 21 56 126 252 462 792 1287 2002 3003 4368 6188 8568 11628 15504 20349 26334 33649 42504 53130 1 7 28 84 210 462 924 1716 3003 5005 8008 12376 18564 27132 38760 54264 74613 100947 134596 177100 230230 1 8 36 120 330 792 1716 3432 6435 11440 19448 31824 50388 77520 116280 170544 245157 346104 480700 657800 888030 1 9 45 165 495 1287 3003 6435 12870 24310 43758 75582 125970 203490 319770 490314 735471 1081575 1562275 2220075 3108105 1 10 55 220 715 2002 5005 11440 24310 48620 92378 167960 293930 497420 817190 1307504 2042975 3124550 4686825 6906900 10015005 1 11 66 286 1001 3003 8008 19448 43758 92378 184756 352716 646646 1144066 1961256 3268760 5311735 8436285 13123110 20030010 30045015 1 12 78 364 1365 4368 12376 31824 75582 167960 352716 705432 1352078 2496144 4457400 7726160 13037895 21474180 34597290 54627300 84672315 1 13 91 455 1820 6188 18564 50388 125970 293930 646646 1352078 2704156 5200300 9657700 17383860 30421755 51895935 86493225 141120525 225792840 1 14 105 560 2380 8568 27132 77520 203490 497420 1144066 2496144 5200300 10400600 20058300 37442160 67863915 119759850 206253075 347373600 573166440 1 15 120 680 3060 11628 38760 116280 319770 817190 1961256 4457400 9657700 20058300 40116600 77558760 145422675 265182525 471435600 818809200 1391975640 1 16 136 816 3876 15504 54264 170544 490314 1307504 3268760 7726160 17383860 37442160 77558760 155117520 300540195 565722720 1037158320 1855967520 3247943160 1 17 153 969 4845 20349 74613 245157 735471 2042975 5311735 13037895 30421755 67863915 145422675 300540195 601080390 1166803110 2203961430 4059928950 7307872110 1 18 171 1140 5985 26334 100947 346104 1081575 3124550 8436285 21474180 51895935 119759850 265182525 565722720 1166803110 2333606220 4537567650 8597496600 15905368710 1 19 190 1330 7315 33649 134596 480700 1562275 4686825 13123110 34597290 86493225 206253075 471435600 1037158320 2203961430 4537567650 9075135300 17672631900 33578000610 1 20 210 1540 8855 42504 177100 657800 2220075 6906900 20030010 54627300 141120525 347373600 818809200 1855967520 4059928950 8597496600 17672631900 35345263800 68923264410 1 21 231 1771 10626 53130 230230 888030 3108105 10015005 30045015 84672315 225792840 573166440 1391975640 3247943160 7307872110 15905368710 33578000610 68923264410 137846528820 |
정답
137846528820 |
심화 공부
중복집합 순열(Permutations of Multisets)
중복집합 M의 각 원소의 개수가 이고 그 합이 일 때 순열의 개수는 다음과 같다.
예를 들어, 영단어 MISSISSIPPI의 모든 문자를 사용한 순열의 수는 다음과 같다.
728x90
그리드형(광고전용)
'Problem Solving > Project Euler' 카테고리의 다른 글
[Project Euler #17][C++] 1부터 1000까지 영어로 썼을 때 사용된 글자의 개수는? (0) | 2021.01.04 |
---|---|
[Project Euler #16][C++] 의 각 자릿수를 모두 더하면? (0) | 2020.12.31 |
[Project Euler #14][C++] 백만 이하로 시작하는 우박수 중 가장 긴 과정을 거치는 것은? (0) | 2020.12.28 |
[Project Euler #13][C++] 50자리 수 100개를 더한 값의 첫 10자리 구하기 (0) | 2020.12.27 |
[Project Euler #12][C++] 500개 이상의 약수를 갖는 가장 작은 삼각수는? (0) | 2020.12.26 |
[Project Euler #11][C++] 20×20 격자에서 연속된 네 수의 곱 중 최댓값 (0) | 2020.12.26 |
[Project Euler #10][C++]이백만 이하 소수의 합 (0) | 2020.12.24 |
[Project Euler #9][C++] a + b + c = 1000 이 되는 피타고라스 수 (0) | 2020.12.23 |