사실 이번 문제는 상당히 쉬운 편이라서 그다지 설명이 필요할 것도 없을 듯 합니다. 다른 프로그래머도 저랑 비슷한 접근을 했고요. 2014년 년 마지막 날을 이렇게 보내네요.
이 문제는 격자(grid)를 기반으로 한 경로 계산 문제입니다. 다음은 문제의 배경과 요구사항입니다:
문제 설명:
2차원 격자가 주어졌을 때, 왼쪽 위 모서리에서 오른쪽 아래 모서리까지 이동하는 경로의 수를 계산합니다. 이때 이동은 오직 오른쪽 또는 아래쪽 방향으로만 가능합니다. 격자의 크기는
문제의 요구사항:
•
• 경로의 수는 조합 수식을 사용하여 계산됩니다. 수학적으로, C(2n, n) 로 표현할 수 있습니다. 여기서
• 숫자가 커질 수 있으므로 정밀도 높은 계산이 요구됩니다.

예를 들면 2x2 격자에서 오른쪽과 아래로만 갈 수 있는 경로의 수는, 오른쪽 이동을 R, 아래 이동을 D라 표현하면 다음과 같습니다.
RRDD
RDRD
RDDR
DRRD
DRDR
DDRR
위와 같이 총 6가지의 경우가 나옵니다. 이 중에 R만을 가지고 따진다면, 4개의 칸 중에 2개의 R을 배치하는 방법의 수입니다.
프로젝트 오일러의 문제 링크입니다.
https://projecteuler.net/problem=15
Problem 15 - Project Euler
Starting in the top left corner of a 2×2 grid, and only being able to move to the right and down, there are exactly 6 routes to the bottom right corner. How many such routes are there through a 20×20 grid?
projecteuler.net
결국 우리가 구해야 할 것은,
이 방법 말고도 파스칼의 삼각형 원리를 이용해서 계산할 수도 있습니다.
그래보았자 원래의 조합의 수가 큰 경우는 모두 도로 아미타불입니다. 때로 나머지 연산이 주어질 때가 있고, 소수 나머지 연산이 주어질 때가 있습니다. 그 때에는 그에 맞는 알고리즘을 선택하면 됩니다.

다음 프로그램은 40개중에 20개를 선택하는 조합을 구하는 프로그램입니다.
//------------------------------------------------
// Project Euler #15 - Counting fractions
// - by Aubrey Choi
// - created at 2014-12-31
//------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void solve1()
{
int n=40, r=1;
long long c = 1;
for(;r<=20;n--,r++) { c *= n; c /= r; }
printf("Ans = %lld\n", c);
}
int main()
{
clock_t t;
t = clock();
solve1();
printf("Elapsed time is %.3f seconds \n", (float)(clock() - t) / CLOCKS_PER_SEC);
return 0;
}
'Programming > Project Euler' 카테고리의 다른 글
[C/C++] 프로젝트 오일러 #17 : 영어 단어의 글자수 세기(구현) (0) | 2015.01.14 |
---|---|
[C/C++] 프로젝트 오일러 #16 : 2의 1000승의 모든 자릿수 합 구하기(BigInteger) (0) | 2015.01.13 |
[C/C++] 프로젝트 오일러 #14 Longest Collatz Sequence(동적 프로그래밍) (0) | 2014.12.30 |
[C/C++] 프로젝트 오일러 #13 BigInt 수의 합 구하기 (0) | 2014.12.30 |
[C/C++] 프로젝트 오일러 #12 Highly Divisible Triangular Number (0) | 2014.12.29 |
댓글