1619, 1/81 회원가입  로그인  
   sihun1113
   강좌그림1~14.zip (0 Byte), Download : 129     [오른쪽 버튼 눌러 다운 받기]
   [응용] 수학이 뭔데? 도형그리기에서 찾아보는 간단한 수학 원리 응용 (사진첨부)

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=1769 [복사]


이 게시판에 사진을 올릴수 없어서 첨부파일로 올리겠습니다.....
다운 받으셔서 참고해 주시기 바랍니다.

.......................................................................................................................................................................................................





이전 [잡담] 게시글에서 밝힌 바와 같이 프로그래밍은 수학과 매우 밀접한 관계에 있습니다. 때문에 수학을 잘 하는 사람이 프로그래밍도 잘 할 가능성이 높지요. 제가 여기서 가능성이라고 한 것을 주목해 주시기 바랍니다. 수학을 잘 하는 것이 프로그래밍 실력을 보장하지는 않는 다는 말입니다. 아무리 수학을 잘 해도 기본적으로 프로그래밍 기초가 없다면 물론 프로그래밍을 할 수 없습니다. 수학지식 따로 프로그래밍 지식 따로, 전혀 별개의 영역으로만 생각해도 여전히 무용지물이구요. 핵심은 수학에서 쌓은 실력을 프로그래밍에 적용할 수 있어야 한다는 점이에요. 그래서 제가 여기서 알아보고자 하는 건, 수학 원리를 어떻게 프로그램에 적용하느냐하는 겁니다.




물론, 수학의 전반적인 지식을 다 끌어다가 접목시킬... 시간도 없고... 더 나아가 능력도 안됩니다;;;; 그래서 선택한 게 프로그래머라면 누구나 한 번 쯤은 해 봤을 콘솔 도형 그리기입니다. 처음 프로그래밍을 익히시는 분들은 잘 느끼시지 못할 지 모르겠지만, 이 도형그리기는 if,while,for문 등의 조건식을 구성하는 방법을 훈련하는 최고의 예제들입니다. 이 도형그리기를 자유자제로 다룰 줄 알아야만 비로소 다음 단계로 나아갈 수 있다는 거지요.



이른바 피라미드 그리기로 알려진 콘솔 도형 그리기는 수 많은 예제들이 알려져있고, 마음대로 만들 수도 있습니다. 심지어는 하트모양까지도... 그리고, 각 도형마다 해법도 다양하지요. 도형 그리기는 비단 초보들만의 실용예제가 아닌 중/고급 프로그래머들의 심심풀이 또는 오락(?)용으로도 자주 쓰이는 재미있는 예제랍니다. 누가 더 짧은, 누가 더 빠른, 누가 더 효율적인, 누가 더 독창적인 등등... 온갖 테마를 가지고 변용이 되는 걸 심심찮게 볼 수 있어요. 이런 일이 가능한 것은 그 저변에 '알고리즘'을 누가 더 잘 활용하느냐라는 다소 무거운 테마가 자리잡고 있긴 하지만, 이런 건 단 시간에 이뤄지는 게 아니기 때문에 초급 단계에서 거론 할 내용은 아닌 듯 싶고, 제가 주목하고자 하는 바는 기본적으로 '어떻게 하면 그림을 그리는 방법을 찾아내는가'입니다. 한 번 예제를 보시죠.



*

**

***

****

*****



도형그리기의 기초중의 기초인 직각 삼각형 Mark-I 입니(퍽!..)..... ㅜ,.ㅜ



아마 이 삼각형은 2중 중첩루프를 사용해 누구나 쉽게 그릴 수 있으리라 생각합니다. 코드는 다음과 같지요.

(코드를 명시적으로 표현하기 위해 불필요한 축약형은 피하겠습니다)






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

{

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

    {

        if( j <= i )

        {

            printf( "*" );

        }

    }

    printf( "\n" );

}





여러분은 보통 이런 코드를 만들 때 어떻게 만드시나요? 대부분 이런 과정을 거치지 않나 생각합니다.

음.. 가장 먼저 첫 줄에는 별이 한개고, 두번째 줄에는 두개, 세번째 줄에는 세개?? 이게 패턴인가보군. 그럼 행 인덱스랑 열 인덱스를 비교해서 행 인덱스보다 작거나 같으면 별을 표시하게 하면 되겠네?

맞는 얘깁니다. 그렇게 구하는 게 일반적이지요. 그렇다면 다음같은 도형은?



*****

****

***

**

*



피라미드를 만들 때 보통 두번째 예제로 등장하는 도형입니다. 이건 어떻게 코드를 작성할까요? 이 피라미드는 보통 두가지 방식으로 해법을 구하게 됩니다.






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

{

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

    {

        if( j <= 5-i )

        {

            printf( "*" );

        }

    }

    printf( "\n" );

}

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

{

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

    {

        printf( "*" );

    }

    printf( "\n" );

}









굉장히 간단하지만, 실제론 최소한의 경험이 있지 않으면 의외로 찾아내기 힘든 코드입니다.

첫 번째 식은, 전체 길이에서 줄 길이 만큼 뺄 때 원하는 값이 나온다는 것을 알아야 하고, 특히 두번째 식 같은 경우엔 중첩루프를 왠만큼 경험해 보지 않고는 쉽게 생각하기 힘든 코드죠. 다시말해 초보들이 그냥 어림짐작으로는 절대 만들어 낼 수 없는 코드라는 겁니다. 그래서 대부분이 해답을 보면서 '아 이런 방법이 있었구나?'라며 '경험'을 쌓아 비슷한 유형이 나오면 적용하는 수준에 그친다는 것이죠. 그러다보니 또 다른 유형의 문제가 나오면 또 새로운 해법을 찾아야 하고, 다른 사람이 제공해 준 해답을 보면서 경험을 쌓아 문제를 해결해 나가는... 솔직히는 별로 좋지 못한 학습 순환 고리가 형성됩니다.



여러분중 대다수 역시 초보 시절에 도형 그리기 예제를 풀 때, 해답을 보고나서야 도형 그리기를 이해 하신 분들이 꽤 계실겁니다. 하지만... 누군가가 이미 풀어 놓은 해법을 보고 나서야 이해가 된다면, 해법이 없는 문제들은 어떻게 하나요? 그럴 때 필요한 게 바로 수학입니다.





<그림 1>

콘솔 화면은 다음 <그림1>에서 보여지는 것 처럼 일반적으로 가로 80자, 세로 25자를 표시 할 수 있도록 되어 있습니다. 결론부터 이야기 하자면, 콘솔 화면은 가로 길이가 80, 세로 길이가 25인 좌표 그래프라고 할 수 있습니다.<그림2> 다만, 우리가 일반적으로 생각하는 좌표계가 아닌, 위 아래가 뒤집힌 모양의 좌표계가 되겠지만 말이죠.<그림3>





<그림 2>





<그림 3>





이제 몇가지 도형을 가지고 실제적인 수학 적용으로 들어가보죠. 우선 맨 처음 나왔던 기본 직각삼각형입니다. 이 삼각형을 좌표계 위에 올려놓고 보면 다음과 같이 될겁니다. <그림 4> (이후로는 수학 좌표계만 사용하겠습니다.)



<그림 4>



여기서 별들이 늘어 서 있는 경계 부분을 보게 되면, 가장 기본적인 수식 하나를 발견하게 됩니다. 바로 y=x 1차 함수의 기본이지요. <그림 5>



<그림 5>



이제 별들이 있는 곳을 영역으로 확장시켜보면 다음과 같은 부등식을 얻을 수 있습니다. y≥x 역시 1차 부등식의 기본입니다.<그림 6>



<그림 6>

이제 2중 중첩 루프를 돌리면서 행과 열로 한정되는 영역( 1≤x≤5, 1≤y≤5 )과 y≥x를 겹치게 되면 아래와 같은 도형이 등장하게 되는 겁니다. 이제 남은 것은, 이 영역을 어떻게 프로그램 코드화 하느냐입니다.





<그림 7>



먼저 y축에 해당하는 영역은 외측 루프가 담당하게 되고, x축에 해당하는 영역은 내측 루프가 담당하게 된다는 것을 기억해 주세요. 이것을 코드화 한 것이 바로



// 시작줄   끝줄

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

{

       시작칸   끝칸

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

    {

        ?

    }

    printf( "\n" );

}



C 언어에서 [인덱스는 0부터 시작한다]와, 루프 종료는 [마지막 요소보다 작다]를 보편적으로 사용하므로 다음과 같은 코드가 주로 사용됩니다.



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

{

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

    {

        ?

    }

    printf( "\n" );

}



여기에 마지막 부등식인 y≥x 을 추가 한 것이 바로 아래의 코드입니다.



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

{

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

    {

        if(y>=x)

        {

            printf( "*" );

        }

    }

    printf( "\n" );

}



최종적으로, C 코드의 일반적인 스타일에 따라, 루프의 인덱스를 x, y에서 i, j로 바꾸어 주면



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

{

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

    {

        if( i>=j)

        {

            printf( "*" );

        }

// 상황에 따라서 공백문자를 넣어주는

//      else

//      {

//          printf( " " );

//      }

// 코드를 삽입해 줍니다.

    }

    printf( "\n" );

}



라는 코드가 완성되게 되는 겁니다. 이제, 두번째 예제인 거꾸로 된 피라미드를 그려볼까요?(좌표계 때문에 그림이 뒤집혀 있다는 거 잊지 말아주세요 ^^;)





<그림 8>





<그림 9>

이번 그림에서는 y=-x+6 이라는 식을 얻습니다. 그리고



<그림 10>

이번에는 영역이 반대가 되니 y≤-x+6 이라는 부등식을 얻게 되겠지요. x와 y의 범위에는 변동이 없으므로 이를 i, j로 변환해 코드로 표현하게 되면 아래와 같은 코드가 탄생되게 되는 겁니다.



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

{

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

    {

        if(i<=-j+6)

        {

            printf( "*" );

        }

    }

    printf( "\n" );

}



<그림 11>

그런데.. 보통 수학 그래프를 보게 되면, 기준점을 1,1이 아니라 0,0으로 잡죠? 이를 그림으로 표현하면 이렇게 됩니다.



<그림 12>

y 절편의 값이 +6에서 +4로 바뀌었지요? 이를 코드에 적용하면 아래와 같은 최종 코드가 탄생하게 되는 겁니다.



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

{

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

    {

        if(i<=4-j) // -j+4를 자리만 바꾼 것. i<=4-j 대신 i<5-j 역시 똑같이 동작

        {

            printf( "*" );

        }

    }

    printf( "\n" );

}



자... 저~~으기 위에 나왔던 두개의 해법 중 첫번째 해법과 거의 똑같죠? 영역을 구해 도형을 그리는 문제는 이런 간단한 수학식을 사용해 얼마든지 표현 할 수 있습니다. 예를 들어 다음과 같은 도형은 어떻게 해야 할까요?



*       *

**     **

***   ***

**** ****

*********

**** ****

***   ***

**     **

*       *



이건 사실 조금 더 복잡합니다. 저 도형에서는 두개의 1차 방정식을 찾을 수 있는데, 다음 그림과 같이 도형을 상/하로 나누어 부등식 관계를 찾아 도형을 그려야 합니다.



<그림 13>



거꾸로 이런 건 어떨까요?



*********

*******

  *****

   ***

    *

   ***

  *****

*******

*********



이것 역시 바로 윗 도형과 똑같은 두개의 1차 방정식을 찾을 수 있는데, 부등호의 방향만 바뀔 뿐, 수식을 적용하는 방법은 동일합니다. 이런 도형 그리기가 익숙해지면 점차 고등 수학식을 이용해서, 2차 또는 고차 포물선을 그린다던가, 원, 베지어 곡선 도 그릴 수 있고, 심지어는 하트 그리기 공식을 이용해 하트까지 그릴 수도 있지요.





<그림 14>

실제로 많은 프로그램들에서... 꼭 콘솔용이 아니더라도, 그래픽과 관련 된 여러 프로그램들에서 이런 수학식들을 사용해 그림을 그리고 있습니다. 비단 2차원 그래픽 만이 아니라 3차원 그래픽의 경우엔 더더욱 이런 수학식을 많이 사용합니다.



이번... 글... 처음엔 간단히 쓸 생각이었는데.. 또 장문의 글이 되어버렸네요. 아무튼... 이번 글에서는 도형 그리기를 잠깐 살펴 봤는데, 도형 그리기 자체가 목적이 아니라, 도형 그리기를 할 때 수학이 어떻게 응용이 되는지를 알아보는 게 목적이었다는 사실... 꼭 잊지 말아주세요 ㅠㅠ...(왜 xxx 도형이나 ooo 도형은 안 해줘요?...라고 물어보시면 섭섭합니다..)



조금이나마 도움이 되셨길 바라며... 다음엔 기회가 된다면 일반적인 조건식 또는 평가식을 찾을 때, and(&&) 나 or(||) 조건을 어떻게 사용해야 할지를 '집합'과 '수의 범위' 측면에서 다뤄볼까 합니다... 그렇다고... 기대는 하지 말아주세요;;; 또 언제 글을 올리게 될지.... 1년 후가 될지.. 영 안 올리게 될지... 저도 장담 못합니다;;;;;;







P.S. 종이에 그림을 그리듯 여기도 편하게 그림을 그리거나 끄적거릴 수 있다면 참 좋겠다는 생각이 드네요... ㅠㅠ

[출처] [응용] 수학이 뭔데? 도형그리기에서 찾아보는 간단한 수학 원리 응용 (C언어를 배우자) |작성자 때릴꺼야


http://blog.naver.com/ani4ever
여기 위에있는곳에 들어가시면 강좌를 보실수 있습니다..
여기에 들어가시면 때릴꺼야님의 강좌가 다있습니다...

  Hit : 10383     Date : 2011/05/25 09:52



    
capt_0669 예전에 비쥬얼베이직으로 해봤다능 2011/05/27