using System;
namespace PascalTriangle
{
class PTriangle
{
private int[][] _triangle; //파스칼 삼각형
private int _row; //삼각형의 총 행
private int _count; //현재 반환중인 행
private int _max; //삼각형의 최댓값
/// <summary>
/// 파스칼 삼각형입니다.
/// </summary>
public int[][] triangle { get { return _triangle; } }
/// <summary>
/// 파스칼 삼각형의 행 수입니다.
/// </summary>
public int row { get { return _row; } }
/// <summary>
/// next 호출시 출력할 행입니다.
/// </summary>
public int count { get { return _count; } }
/// <summary>
/// 파스칼 삼각형의 최댓값입니다.
/// </summary>
public int max { get { return _max; } }
/// <summary>
/// 원하는 크기의 파스칼 삼각형을 생성합니다.
/// </summary>
/// <param name="row">원하는 파스칼 삼각형의 행 수입니다.</param>
public PTriangle(int row)
{
this._row = row;
_count = 1;
_triangle = new int[this._row][];
_triangle[0] = new int[] { 1 };
if (this._row > 1) _triangle[1] = new int[] { 1, 1 };
for (int i = 2; i < this._row; i++)
{
_triangle[i] = new int[i+1];
_triangle[i][0] = 1; //줄의 맨 처음
_triangle[i][i] = 1; //줄의 맨 마지막
for (int j = 0; j < i - 1; j++)
{
_triangle[i][j+1] = _triangle[i-1][j] + _triangle[i-1][j+1]; //파스칼 삼각형 규칙
}
}
_max = _triangle[row-1][(row-1)/2];
}
/// <summary>
/// 파스칼 삼각형의 다음 행을 반환합니다.
/// </summary>
/// <returns></returns>
public int[] next()
{
if (_count > _row) return new int[0];
_count++;
return _triangle[_count-2];
}
/// <summary>
/// count를 1로 초기화시킵니다.
/// </summary>
public void resetCount()
{
_count = 1;
}
/// <summary>
/// 파스칼 삼각형의 원하는 행을 반환합니다.
/// </summary>
/// <param name="row">원하는 행입니다.</param>
/// <returns></returns>
public int[] getData(int row)
{
return _triangle[row-1];
}
/// <summary>
/// 파스칼 삼각형의 원하는 행과 열을 반환합니다.
/// </summary>
/// <param name="row">원하는 행입니다.</param>
/// <param name="column">원하는 열입니다.</param>
/// <returns></returns>
public int getData(int row, int column)
{
return _triangle[row-1][column-1];
}
}
}