Difference between r1.2 and the current
@@ -1,15 +1,23 @@
= 개요 =
기존에 파스칼 삼각형 페이지가 있었기 때문에 '''조영준/파스칼삼각형'''에서 이름 바꿈 하였습니다. - [안혁준]
= 개요 =
* 일시 : 2013년 4월 19일 00시 10분* 동기
*지피실에서 시험공부하다가 지겨워져서 지피실에 계신 선배분들에게 간단한 코드 연습거리를 달라고 말씀드렸더니 크기 10의 파스칼 삼각형을 출력하라고 하셨다. 그래서 바로 착수.
* 지피실에서 시험공부하다가 지겨워져서 지피실에 계신 선배분들에게 간단한 코드 연습거리를 달라고 말씀드렸더니 크기 10의 파스칼 삼각형을 출력하라고 하셨다. 그래서 바로 착수.
* 개발 시간 : 90분* 크기 10짜리 파스칼 삼각형을 만드는 데에는 30분 걸림. 그런데 개인적으로 뭘 만들고 더 개조하는 것을 좋아해서 삼각형의 크기를 입력받아서 출력하도록 바꿨는데 아주 사소한 문제가 등장. 정말 간단한 문제였는데 왜 그거가지고 20분을 고민했는지 아직도 이해가 안 된다. 그리고 10분을 투자해서 원하는 크기의 삼각형을 출력하도록 바꾸었고, 30분을 더 투자해서 파스칼 삼각형의 최대값에 따라 출력 크기 설정하도록 변경.
* 개발 언어 : C#
* 개발 언어 : [:CSharp C#]
* 아쉬운 점* 원래 더 큰 숫자의 삼각형 크기를 가질 수 있도록 하려고 했지만 콘솔창의 가로 폭이 좁아서 불가능. 내가 왜 이렇게 짰는데 엉엉.
* [김해천] 선배님의 도움을 받아 콘솔창의 가로 폭을 늘렸다. 신난다!
* 파스칼 삼각형의 최대값을 그냥 공식으로 바로 구하려고 했는데 조합이나 팩토리얼 매소드를 못 찾고 짜기도 귀찮아서 그냥 직접 구하는 방식으로 변경. * 그런데 [김해천] 선배님 말씀으로는 곱하기를 쓰는 것 보다는 직접 더해서 구하는게 더 효율적이라고 하시더라. 나중에 더 자세히 배우겠지.
* 받을 수 있는 수의 제한을 풀었으니 그에 따라서 오류가 발생할 가능성이 생기기 때문에 그걸 처리해야 하는데 귀찮아서 생략.
= 소스 === Program.cs ==
== r3 (2013/04/23) ==
=== 변경점 ===
* PTriangle 클래스에 대한 XML주석을 추가했습니다.
* 다른 사람이 쓰게 된다는 가정하에 연습삼아 처음으로 달아봤습니다.
=== Program.cs ===
{{{// 파스칼 삼각형 출력
using System;
@@ -23,14 +31,13 @@
int lines;
while (true)
{
try
{
lines = Convert.ToInt32(s);
// 14 이상에는 삼각형이 정상 출력되나 보기 좋지 않음
Exception e = new Exception("유효하지 않은 범위입니다");
throw e;
}
while (true)
{
Console.WriteLine("삼각형의 크기를 입력하세요 (1~13, 0 = exit)");
Console.WriteLine("삼각형의 크기를 입력하세요 (0 = exit)");
s = Console.ReadLine(); //삼각형 크기를 입력받음try
{
lines = Convert.ToInt32(s);
if (lines < 0 || lines > 13)
if (lines < 0)
{throw e;
}
@@ -53,61 +60,99 @@
}
}
}}}
using System;
namespace PascalTriangle
{
class PTriangle
{
private int[] current; // 현재 줄
{
this.lines = lines;
count = 1;
}
if (count == 1)
{
//삼각형의 머리일 경우
count++;
return savePrv(new int[] { 1 });
}
current = new int[count];
current[0] = 1; //줄의 맨 처음
current[count-1] = 1; //줄의 맨 마지막
current[i + 1] = prv[i] + prv[i + 1]; //파스칼 삼각형 규칙
count++;
return savePrv(current);
//파스칼 삼각형의 최대값 반환
for(int i = 0 ; i < lines ; i++)
{
Next();
}
private int[] savePrv(int[] i)
prv = i;
}
}
}}}
using System;
namespace PascalTriangle
}
}}}
== PTriangle.cs ==
=== PTriangle.cs ===
{{{using System;
namespace PascalTriangle
{
class PTriangle
{
private int lines; //삼각형의 총 줄
private int count; //현재 반환중인 줄
private int[] prv; // 이전 줄
public PTriangle(int lines)
public int[] Next()
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)
{ for (int i = 0; i < current.Length - 2; i++)
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];
} public int getMax()
/// <summary>
/// 파스칼 삼각형의 다음 행을 반환합니다.
/// </summary>
/// <returns></returns>
public int[] next()
{ count = 1; //초기화
return current[lines/2];
if (_count > _row) return new int[0];
_count++;
return _triangle[_count-2];
} /// <summary>
/// count를 1로 초기화시킵니다.
/// </summary>
public void resetCount()
{ //리턴과 동시에 int[] prv에 저장
return i;
_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];
}}
}
}}}
== Printer.cs ==
=== Printer.cs ===
{{{using System;
namespace PascalTriangle
@@ -132,7 +177,7 @@
printEmpty(scale / 2);
count--;
}
// 좌측의 빈 공간 출력
printEmpty(scale);
count--;
}
for (int i = 0; i < count / 2; i++ )
for (int i = 0; i < count / 2; i++)
{// 좌측의 빈 공간 출력
printEmpty(scale);
@@ -157,16 +202,16 @@
}
}
}}}
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1
1 1
}
}}}
== 결과 ==
=== 결과 ===
{{{삼각형의 크기를 입력하세요 (1~13, 0 = exit)
삼각형의 크기를 입력하세요 (0 = exit)
51
1 1
1 2 1
1 3 3 1
1 4 6 4 1
삼각형의 크기를 입력하세요 (1~13, 0 = exit)
삼각형의 크기를 입력하세요 (0 = exit)
61
1 1
@@ -174,5 +219,8 @@
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 4 6 4 1
1 5 10 10 5 1
삼각형의 크기를 입력하세요 (1~13, 0 = exit)
삼각형의 크기를 입력하세요 (0 = exit)
0}}}== 이전 버전 ==
[조영준/파스칼삼각형/이전버전]
기존에 파스칼 삼각형 페이지가 있었기 때문에 조영준/파스칼삼각형에서 이름 바꿈 하였습니다. - 안혁준
개요 ¶
- 일시 : 2013년 4월 19일 00시 10분
- 동기
- 지피실에서 시험공부하다가 지겨워져서 지피실에 계신 선배분들에게 간단한 코드 연습거리를 달라고 말씀드렸더니 크기 10의 파스칼 삼각형을 출력하라고 하셨다. 그래서 바로 착수.
- 지피실에서 시험공부하다가 지겨워져서 지피실에 계신 선배분들에게 간단한 코드 연습거리를 달라고 말씀드렸더니 크기 10의 파스칼 삼각형을 출력하라고 하셨다. 그래서 바로 착수.
- 개발 시간 : 90분
- 크기 10짜리 파스칼 삼각형을 만드는 데에는 30분 걸림. 그런데 개인적으로 뭘 만들고 더 개조하는 것을 좋아해서 삼각형의 크기를 입력받아서 출력하도록 바꿨는데 아주 사소한 문제가 등장. 정말 간단한 문제였는데 왜 그거가지고 20분을 고민했는지 아직도 이해가 안 된다. 그리고 10분을 투자해서 원하는 크기의 삼각형을 출력하도록 바꾸었고, 30분을 더 투자해서 파스칼 삼각형의 최대값에 따라 출력 크기 설정하도록 변경.
- 크기 10짜리 파스칼 삼각형을 만드는 데에는 30분 걸림. 그런데 개인적으로 뭘 만들고 더 개조하는 것을 좋아해서 삼각형의 크기를 입력받아서 출력하도록 바꿨는데 아주 사소한 문제가 등장. 정말 간단한 문제였는데 왜 그거가지고 20분을 고민했는지 아직도 이해가 안 된다. 그리고 10분을 투자해서 원하는 크기의 삼각형을 출력하도록 바꾸었고, 30분을 더 투자해서 파스칼 삼각형의 최대값에 따라 출력 크기 설정하도록 변경.
- 개발 언어 : C#
- 아쉬운 점
- 원래 더 큰 숫자의 삼각형 크기를 가질 수 있도록 하려고 했지만 콘솔창의 가로 폭이 좁아서 불가능. 내가 왜 이렇게 짰는데 엉엉.
- 김해천 선배님의 도움을 받아 콘솔창의 가로 폭을 늘렸다. 신난다!
- 김해천 선배님의 도움을 받아 콘솔창의 가로 폭을 늘렸다. 신난다!
- 파스칼 삼각형의 최대값을 그냥 공식으로 바로 구하려고 했는데 조합이나 팩토리얼 매소드를 못 찾고 짜기도 귀찮아서 그냥 직접 구하는 방식으로 변경.
- 그런데 김해천 선배님 말씀으로는 곱하기를 쓰는 것 보다는 직접 더해서 구하는게 더 효율적이라고 하시더라. 나중에 더 자세히 배우겠지.
- 그런데 김해천 선배님 말씀으로는 곱하기를 쓰는 것 보다는 직접 더해서 구하는게 더 효율적이라고 하시더라. 나중에 더 자세히 배우겠지.
- 받을 수 있는 수의 제한을 풀었으니 그에 따라서 오류가 발생할 가능성이 생기기 때문에 그걸 처리해야 하는데 귀찮아서 생략.
- 원래 더 큰 숫자의 삼각형 크기를 가질 수 있도록 하려고 했지만 콘솔창의 가로 폭이 좁아서 불가능. 내가 왜 이렇게 짰는데 엉엉.
소스 ¶
r3 (2013/04/23) ¶
Program.cs ¶
// 파스칼 삼각형 출력 using System; namespace PascalTriangle { class Program { static void Main(string[] args) { string s; int lines; while (true) { Console.WriteLine("삼각형의 크기를 입력하세요 (0 = exit)"); s = Console.ReadLine(); //삼각형 크기를 입력받음 try { lines = Convert.ToInt32(s); if (lines < 0) { Exception e = new Exception("유효하지 않은 범위입니다"); throw e; } } catch (Exception e) { Console.WriteLine(e.Message); continue; } if (lines == 0) return; // 프로그램 종료 PTriangle pTriangle = new PTriangle(lines); Printer printer = new Printer(lines, pTriangle.getMax().ToString().Length+1); for (int i = 0; i < lines; i++) { printer.print(pTriangle.Next()); } } } } }
PTriangle.cs ¶
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]; } } }
Printer.cs ¶
using System; namespace PascalTriangle { class Printer { private int lines; //총 출력할 줄 private int count; //좌우로 출력해야할 빈 공간의 수 (4칸이 한 단위) private int scale; //한 칸당 너비 짝수야 한다 public Printer(int lines, int scale) { this.lines = lines; this.scale = scale; if (scale % 2 == 1) this.scale++; //너비가 홀수이면 짝수로 변경 } public void print(int[] nums) { count = lines - nums.Length; if (count % 2 == 1) { // 빈 공간의 수가 홀수일 경우 그 반을 출력 printEmpty(scale / 2); count--; } for (int i = 0; i < count / 2; i++) { // 좌측의 빈 공간 출력 printEmpty(scale); } for (int i = 0; i < nums.Length; i++) { // 빈 공각 출력 printEmpty(scale - nums[i].ToString().Length); // 숫자 출력 Console.Write(nums[i]); } Console.Write("\n"); } private void printEmpty(int size) { //입력받은 수 만큼 빈 칸 출력 for (int i = 0; i < size; i++) { Console.Write(" "); } } } }
결과 ¶
삼각형의 크기를 입력하세요 (0 = exit) 5 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 삼각형의 크기를 입력하세요 (0 = exit) 6 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 삼각형의 크기를 입력하세요 (0 = exit) 0