U E D R , A S I H C RSS

파스칼삼각형/조영준

기존에 파스칼 삼각형 페이지가 있었기 때문에 조영준/파스칼삼각형에서 이름 바꿈 하였습니다. - 안혁준

개요

  • 일시 : 2013년 4월 19일 00시 10분
  • 동기
    • 지피실에서 시험공부하다가 지겨워져서 지피실에 계신 선배분들에게 간단한 코드 연습거리를 달라고 말씀드렸더니 크기 10의 파스칼 삼각형을 출력하라고 하셨다. 그래서 바로 착수.
  • 개발 시간 : 90분
    • 크기 10짜리 파스칼 삼각형을 만드는 데에는 30분 걸림. 그런데 개인적으로 뭘 만들고 더 개조하는 것을 좋아해서 삼각형의 크기를 입력받아서 출력하도록 바꿨는데 아주 사소한 문제가 등장. 정말 간단한 문제였는데 왜 그거가지고 20분을 고민했는지 아직도 이해가 안 된다. 그리고 10분을 투자해서 원하는 크기의 삼각형을 출력하도록 바꾸었고, 30분을 더 투자해서 파스칼 삼각형의 최대값에 따라 출력 크기 설정하도록 변경.
  • 개발 언어 : C#
  • 아쉬운 점
    • 원래 더 큰 숫자의 삼각형 크기를 가질 수 있도록 하려고 했지만 콘솔창의 가로 폭이 좁아서 불가능. 내가 왜 이렇게 짰는데 엉엉.
      • 김해천 선배님의 도움을 받아 콘솔창의 가로 폭을 늘렸다. 신난다!
    • 파스칼 삼각형의 최대값을 그냥 공식으로 바로 구하려고 했는데 조합이나 팩토리얼 매소드를 못 찾고 짜기도 귀찮아서 그냥 직접 구하는 방식으로 변경.
      • 그런데 김해천 선배님 말씀으로는 곱하기를 쓰는 것 보다는 직접 더해서 구하는게 더 효율적이라고 하시더라. 나중에 더 자세히 배우겠지.
    • 받을 수 있는 수의 제한을 풀었으니 그에 따라서 오류가 발생할 가능성이 생기기 때문에 그걸 처리해야 하는데 귀찮아서 생략.

소스

r3 (2013/04/23)

변경점

  • PTriangle 클래스에 대한 XML주석을 추가했습니다.
    • 다른 사람이 쓰게 된다는 가정하에 연습삼아 처음으로 달아봤습니다.

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

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2013-11-20 07:46:26
Processing time 0.1865 sec