※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 24418번 문제인 알고리즘 수업 - 행렬 경로 문제 1이다.
문제는 아래 링크를 확인하자.

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

 

24418번: 알고리즘 수업 - 행렬 경로 문제 1

오늘도 서준이는 동적 프로그래밍 수업 조교를 하고 있다. 아빠가 수업한 내용을 학생들이 잘 이해했는지 문제를 통해서 확인해보자. 양의 정수로 이루어진 n × n 행렬 m이 주어진다. 행렬의

www.acmicpc.net

코드1이 실행되는 횟수는 (n,n)에서 각각의 (1,i) 까지 도달하는 경로들의 개수의 합과 각각의 (j,1)까지 도달하는 경로들의 개수의 합과 같다. (단, i와 j는 n 이하의 양의 정수)

 

위의 합은 공식을 이용하여 더욱 단순히 할 수 있으니 생각해보자.

 

N이 충분히 작을 때의 조합의 값은 파스칼의 삼각형을 구현하는 것으로도 문제를 해결할 수 있을 정도로 빠르게(O(N^2)) 계산해낼 수 있다.

 

코드2가 실행되는 횟수는 주어지는 행렬의 칸수와 같으므로 N^2이다.

 

문제의 모든 입력을 읽지 않아도 올바른 답만을 출력하면 맞았습니다를 받을 수 있으니, N만 읽고 문제를 해결하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

int comb[31][31];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	for (int i = 0; i < 31; i++) comb[i][0] = comb[i][i] = 1;
	for (int i = 2; i < 31; i++) {
		for (int j = 1; j < i; j++) comb[i][j] = comb[i - 1][j - 1] + comb[i - 1][j];
	}

	int N; cin >> N;
	cout << 2 * comb[2 * N - 1][N] << ' ' << N * N;
}
728x90

+ Recent posts