별찍기와 프로그래밍 기초

타이핑을 생각해 보자.
어떤 뛰어난 사람도 처음의 타이핑은 느리다.
많은 시간의 숙달뒤에 분당 100타, 200타..어느순간 1000타까지 나온다.

프로그래밍도 마찬가지다. 다른 누군가가 익숙하게 프로그램을 작성한다고 해서
본인도 처음부터 무리하게 익숙하게 하려고 하면 포기하게 된다.
분명 단계를 밟아야 한다.

중요한건 이단계를 무시하고 빠르게 타이핑을 하려고만 한다면,
독수리타법같은 방법에 익숙해지게되고, 처음에는 이방법이 더
빠른성취를 보이는것처럼 보이나, 확실한 한계를 보이게 된다.

단계를 확실히 밟아 가라. 건너 뛰지 마라.

프로그램 설계는 러프하게 할수 밖에 없다.
처음부터 정확한 설계를 하는것은 무리다.
이유는 요구사항을 프로그램 설계시점에서 명확하게 알수 없기 때문이다.

하지만, 프로그램 로직은 항상 명확해 한다.
머리속으로만 생각하지 마라. 종이에 쓰거나, 에디터에 그려라.
명확한 표현방법을 스스로 연구해라.
남들이 볼때는 초보자처럼 보여도 기죽지말고 표현방법을 연구해라.
처음에는 순서도도 좋고, 단순히 편집기에 적당히 표현하는 방법도 좋고
적당히 연습장에 그려도 좋다. 연구해라.

프로그램의 기초는 다음과 같다. 어떤 로직도 한가지 방법만으로
해결할수는 없다.
입력값이 무엇이고 출력값이 무엇인가를 명확히 하고 다음 물음에 답을 할수 있어야
로직을 작성할수 있다.

           1. 제약사항들을 찾아 내야한다.
           2. 규칙성을 발견한다.

별찍기 로직

입력값 : n - 최대 별의 갯수다.
출력값 : 만약 n이 3이라면 다음처럼 출력된다.
        ***
         **
          *


* 제약사항 1. 한줄에 출력되는 문자는 항상 n개이다.

      ex)   만약 n이 3이라면,

            ***  - 빈공백 문자 0 개 + 별문자 3개 = 3개 = n
             **  - 빈공백 문자 1 개 + 별문자 2개 = 3개 = n
              *  - 빈공백 문자 2 개 + 별문자 1개 = 3개 = n

* 제약사항 2. 총출력되는 라인의 수는 n개 이다.

      ex)   만약 n이 3이라면,

            ***
             **
              *

            만약 n이 4라면,

            ****
             ***
              **
               *


* 규칙성 1. 라인출력 규칙성
           
            입력값 n에 대해 n개 만큼의 라인을 출력해야 한다.

* 규칙성 2. 라인출력방법의 규칙성 .

            빈공백 문자의 갯수를 b(blank) 라 하고,  별문자의 갯수를 s(star) 라 하고, 라인번호를 l이라 하면,
            규칙성은 다음과 같다.

            n = 3일때

                    l  b  s
            ----------------
            ***  -  1  0  3
            _**  -  2  1  2
            __*  -  3  2  1


            n = 4 일때
                    l  b  s
            ------------ ---
            ****  - 1  0  4
            _***  - 2  1  3
            __**  - 3  2  2
            ___*  - 4  3  1



            규칙성을 찾으면  b 는 항상 l에 의해 결정되고 , b = l - 1 이다.
            만약 라인을 0값부터 시작하도록 했다면, 계산이 더 편했을것이나, 이것은 선택의 문제다.
            s는 n과 b 두개의 값에 의해 결정된다. 규칙성을 찾으면 s = n - b 이다.
       
            정리.

                b = l - 1
                s = n - b
           
            그림을 보고 각자 검증해보자.코딩은 사실 둘째 문제고, 이과정에서 분명하게 검증되어야 한다.
           

* 코딩

자바로 작성하려 했으나, 환경을 까는게 귀찮아, C++ 작성해보았다.

#include <stdio.h>
#include <stdlib.h>

void print_line(int n , int l)
{
    int b = l - 1 ;
    int s = n - b ;
    for(int cnt = 1; cnt <= b; cnt++) printf(" ");
    for(int cnt = 1; cnt <= s; cnt++) printf("*");
    printf(" "); // 줄넘김문자(CR,LF) 를 출력하는 코드인데, 디씨에서 제대로 표현이 안된다.
}

void print_star(int n)
{
    for(int l = 1; l <= n ; l++) // 라인은 n만큼 출력되어야 함으로 n번 반복한다.
      print_line(n,l);

}
int main(int argc, char *argv[]) {

  print_star(5);  

  return 0;
}