[강좌] 초등학생도 풀만한 기초 문제 – 1 : 삼각형 기본 [해설]

많은 프로그래밍 입문을 하고자 하는 사람들의 잘못된 습관이 어떤 프로그래밍 문제가 주어졌을 때 가장 먼저 생각하는 것이 “어떤 함수(혹은 명령어)를 쓰지?” 입니다. 그러고 함수가 생각 안나니까 “아 몰라~” 라고 그냥 포기를 하죠. 사실 함수의 사용 방법은 그렇게 잘 몰라도 됩니다. 물론 기본적이고 자주 써야 하는 것들은 잘 알아둬야 하긴 하지만 초보자 적인 입장에서는 그렇게까지는 필요하지는 않습니다. 그럼 “맨 처음 떠올려야 하는 것”은 무엇인가 라면 만들어지는 과정을 머릿속에 그려내기만 하면 됩니다.

*
**
***
****
*****

이것을 만들기 위한 방법으로 여러 방법이 있습니다. 가장 쉬운 방법은

printf("*\n**\n***\n****\n*****\n");

이거겠죠? ㅎㅎ
하지만 이것은 제대로 된 프로그램이라 보기 힘듭니다. 그럼 이것을 하나하나 풀어서 설명을 해 보겠습니다.
우선 맨 첫줄에 *가 1개가 찍혀 있습니다. 그 다음줄은 2개, 그 다음은 3개 해서 마지막에 5개가 찍혀  있습니다.

* <- 1개
** <- 2개
*** <- 3개
**** <- 4개
***** <- 5개

그럼 이것을 풀어서 C언어로 작성을 하게 되면

printf("*\n");

printf("**\n");

printf("***\n");

printf("****\n");

printf("*****\n");

이렇게 될 것입니다.
물론 뒤에 개행을 해 주는 “\n”을 잊어서는 곤란하겠죠?

다음으로 생각할 것이 전체적으로 *가 첫 줄을 제외하고 모두 1개 이상씩 출력이 됩니다. 이러한 연속 작업을 수행을 할 때 유용한 것이 반복문 입니다. 이 반복문을 이용해서 1번째 줄은 1~1까지(즉 1개만) 2번째 줄은 1~2까지(2개), … , 마지막 5번째 줄은 1~5까지(5개) 출력을 해 주게 만들어 주기만 하면 됩니다.

for(int j=1; j<=1; j++)

printf("*");

printf("\n");

for(int j=1; j<=2; j++)

       printf("*");

printf("\n");

for(int j=1; j<=3; j++)

       printf("*");

printf("\n");

for(int j=1; j<=4; j++)

       printf("*");

printf("\n");

for(int j=1; j<=5; j++)

       printf("*");

printf("\n");

이렇게 만들고 나니 어? 뭔가 반복이 된다는 느낌이 들지 않나요?
네, 바로 이러한 문장이 반복이 되죠~

for(int j=1; j<=반복될 숫자; j++)

printf("*");

printf("\n");

그럼 이것을 1번 더 반복문을 사용하여 위의 문장을 5번 반복시켜 줍니다. “반복될 숫자” 부분에 반복문에서 사용하는 변수를 이용하면 쉽게 값을 변경시켜 줄 수 있습니다.

for(int i=1; i<=5; i++)

{

       for(int j=1; j<=i; j++)

             printf("*");

       printf("\n");

}

그리고 여기서 마무리를 조금 더 더하면 우선 for문 안에 변수를 선언해 줘도 되기는 하지만 사용하기에 따라서 밖으로 빼 주는 것이 더 좋습니다.(물론 사용하기에 따라서 안에 넣는 것이 더 좋을 때도 있긴 하죠. for문이 끝나는 즉시 변수를 해방시키니 메모리를 적절히 이용할 수 있겠죠)
그래서 밖으로 빼면 이렇게 됩니다.

int i, j;

 

for(i=1; i<=5; i++)

{

       for(j=1; j<=i; j++)

             printf("*");

       printf("\n");

}

다음으로 반복문을 굳이 1부터 시작할 필요가 전혀 없습니다. 나중에 나올 배열 같은 경우에도 시작점이 0입니다. 그리고 0서부터 시작을 하면 메모리 한계 점까지 1개를 더 사용할 수 있으니 0서부터 시작하는 것이 좋습니다.

int i, j;

 

for(i=0; i<=4; i++)

{

       for(j=0; j<=i; j++)

             printf("*");

       printf("\n");

}

다음으로 부등호 기호를 쓸 때 “크거나 같을 때” 혹은 “작거나 같을 때” 같이 2번 연산을 요구하는 기호는 될 수 있으면 피하는 것이 좋습니다. 최신 컴파일러는 이 작업을 1번에 처리 할 수 있지만 구형 컴파일러는 이 작업을 2번에 걸처 처리하기 때문에 임베디드쪽 프로그래밍을 할 것이면 신경을 써 주는 것이 좋습니다.

int i, j;

 

for(i=0; i<5; i++)

{

       for(j=0; j<=i; j++)

             printf("*");

       printf("\n");

}

이렇게 되면 완성입니다! 물론 제 기준으로 손볼 것이 좀 더 있긴 하지만 이걸로도 충분합니다.
그럼 제가 만든 것을 보여 드리자면~

#include <stdio.h>

 

void main()

{

       int i=5, j;

 

       for(; i; i--)

       {

             for(j=6-i; j; j--)

                    putchar('*');

             putchar('\n');

       }

}

이렇게 되겠습니다.
최소한의 연산을 추구하다 보니 이런 결과가 나오더라고요 ^^;
임베디드 프로그래밍이나 PHP같은 스크립트 언어가 아니면 이런식으로 작성하지는 마세요~ 알아보기 힘들어요 ㅎㅎ
혹시라도 잘 모르는 부분이 있으면 댓글을 달아 주세요. 답변을 해 드리고 이해가 잘 안갈만한 부분을 수정하겠습니다.

예고] 다음에는 거꾸로 뒤집힌 삼각형을 만들겠습니다. 그럼 다음 이시간까지 안녕~~.

Trackback 0 Comment 2
  1. Favicon of http://mydb.tistory.com BlogIcon 파도소리 2007.01.17 01:44 address edit & del reply

    printf("*\n**\n***\n****\n*****\n";);

    워너츄.. 역시 나에게는 이게.. 딱

    • Favicon of http://www.myhyuny.net BlogIcon 화현 2007.01.17 02:12 address edit & del

      쿨럭!