2025년, 코딩은 선택이 아닌 필수!

2025년 모든 학교에서 코딩이 시작 됩니다. 먼저 준비하는 사람만이 기술을 선도해 갑니다~

강의자료/텍스트기반SW

별찍기 원리에 대해 알아 봅니다.

원당컴퓨터학원 2018. 10. 10. 10:53

저희가 아이들과 공부를 하다 보면 별을 찍는 규칙을 많이 어려워 하더라구요.


별을 찍는 형태는 다음과 같은 형태가 나타납니다.



-*****

--***

---*


이런 경우 프로그램은 다음과 같이 반복문을 구성해 주어야 합니다.


먼저 행이 3행이므로 한행 한행 진행하기 위해서는 3번 반복을 해 주어야 합니다.


다음과 같이

1행

2행

3행

이렇게 반복을 해야 되므로


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

{

printf("%d행\n",i);

}


이런 형태로 프로그램을 찍어야 됩니다.


이때 

1행에서는 -가 1번 반복, *은 5번 반복

2행에서는 -가 2번 반복, *은 3번 반복

3행에서는 -가 3번 반복, *은 1번 반복이 됩니다.

따라서 

printf("%d행\n",i); 가 있는 줄을 삭제하고 

이곳에서 -를 반복하는 for문

*을 반복하는 for문이 들어가면 됩니다.


다음과 같은 형태로 구성이 되겠죠.

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

{

     for(int j=1;j<=(_1_);j++) printf("-"); //_1_번 반복

     for(int j=1;j<=(_2_);j++) printf("*"); //_2_번 반복

     printf("\n");

}


여기서 _1_ 위치에는 행의 갯수만큼 동일한 갯수만큼만 반복 되므로 i 값이 입력되면

i가 1일때 1번 반복

i가 2일때 2번 반복

i가 3일때 3번 반복

이 됩니다.


다음 _2_ 위치의 반복하는 것을 보면 다음과 같습니다.

i가 1일때 5

i가 2일때 3

i가 3일때 1

i가 1씩 증가 됨에 따라서 반복되는 횟수는 2씩 감소가 됩니다.


따라서 [어떤수] - 2*i  의 형태의 규칙이 나옵니다.

여기서 어떤수(x)는 1행에서 x- 2*1 = 5 가 되는 x=7 이 됩니다.


따라서 _2_ 위치에는 7-2*i 값이 들어가면 됩니다.


프로그램을 완성해 보면 다음과 같습니다.


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

{

     for(int j=1;j<=i;j++) printf("-"); 

     for(int j=1;j<=7-2*i;j++) printf("*"); 

     printf("\n");

}


이러한 원리를 이용하면 다음과 같은 프로그램도 가능 할 것입니다.


n=3 일때

-*******---

--*****----

---***-----

n=4 일때

-*********---

--*******----

---*****-----

----***------


먼저 행은 n 만큼 반복을 하므로 큰 틀을 잡으면 다음과 같습니다.


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

{

//각 행에서 수행하는 프로세스

}


각행에서 수행하는 프로세스는 

각 행에서 - 찍는 반복문 한번, * 찍는 반복문 한번, - 찍는 반복문 한번을 다시 수행하게 됩니다.

따라서 다음과 같이 큰틀을 잡아야 합니다.


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

{

    for(int j=1;j<=(_1_);j++) printf("-"); //_1_ 만큼 - 출력

    for(int j=1;j<=(_2_);j++) printf("*"); //_2_ 만큼 * 출력

    for(int j=1;j<=(_3_);j++) printf("-"); //_3_ 만큼 - 출력

    printf("\n");

}


여기서 _1_ 위치는 행 번호인 i 와 동일한 값 만큼 반복 하면 되므로 i 가 입력 되면 됩니다.

다음 _2_ 위치는 2씩 감소되므로 [어떤수] - 2 * i 가 될것입니다.

이때 어떤 수는 n=3 일때 9, n=4 일때 11 이므로 n=5 일때 13,n=6일때 15 가 될것입니다.

이러한 규칙은 n값이 변경됨에 따라 바뀌므로 n을 이용한 규칙을 찾아 보면 2*n + 3 이라는 것을 찾을 수 있습니다.

규칙을 찾을때 2씩 증가가 된다면 해당 변하는 수에 2를 곱한 후에 그 수를 만들기 위해서 + - 를 이용해서 맞춰 주시면 됩니다.


이러한 규칙을 찾으면 _2_ 위치에는 2*n+3-2*i 가 입력되면 됩니다.


_3_ 위치는 i가 1일때 3회,2일때 4회,3일때 5회 이므로 i+2 의 값이 되는 것을 확인 할 수 있습니다.


따라서 모든 소스를 완성해 보면 다음과 같습니다.


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

{

    for(int j=1;j<=i;j++) printf("-"); //_1_ 만큼 - 출력

    for(int j=1;j<=2*n+3-2*i;j++) printf("*"); //_2_ 만큼 * 출력

    for(int j=1;j<=i+2;j++) printf("-"); //_3_ 만큼 - 출력

    printf("\n");

}


이상과 같이 별을 찍어 보았는데요...

이러한 원리에는 행의 갯수를 파악하고...

행의 번호가 증가 함에 따라서 그 안에서 회전하는 반복횟수가 증가한다면 + 감소한다면 -

행의 번호가 1씩 변경됨에 따라서 그 안에서 회전하는 반복횟수가 2배씩이라면 2 * i, 3배씩 증가한다면 3*i 

이런 식으로 규칙을 찾게 된다면 별 찍는 것이 너무 간단하게 됩니다.


위와 같은 경우를 표를 그려서 규칙을 찾는 것도 도움이 됩니다.


n=3 일때

 -반복횟수(1)

 *반복횟수

 -반복횟수(2)

 1

 1

 7

 3

 2

 2

 5

 4

 3

 3

 3

 5


n=4 일때

 i

 -반복횟수(1)

 *반복횟수

 -반복횟수(2)

 1

 1

 9

 3

 2

 2

 7

 4

 3

 3

 5

 5

 4

 4

 3

 7


이렇게 표를 그리고 나면 i는 1 부터 n 까지 반복되는 규칙을 찾을 수 있습니다.

-반복횟수(1) 는 i 값에 따라 같은 횟수로 반복되는 것을 찾을 수 있습니다. 따라서 그안에서 반복 횟수는 1부터 i 까지 반복을 합니다.

*반복횟수는 i 값이 1씩 증가됨에 따라 2씩 감소되므로 (어떤수) - 2*i 라는 식을 얻게 되고 어떤수는 i 가 1일때 n=3 에서는 9 , n=4 에서는 11 이 되므로 n*2 + 3 이라는 식을 얻게 되는데 위에서 언급했듯이 n의 값에 따라 2씩 변경 되는 수이므로 n*2 를 한 후에 +- 를 이용해서 그 값을 맞춰 주시면 됩니다

-반복횟수(2)는 i값이 1씩 증가됨에 따라 1씩 증가 됨으로 (어떤수) + i 가 되며 (어떤수)는 i가 1일때 2가 되는 것을 확인할 수가 있습니다.


이렇게 규칙을 찾게 되면 규칙을 찾는 것 만으로도 별을 찍을수 있겠네요.



처음 별 찍는 학생들이 좀 어려워 하는 것 같아서 규칙을 찾아 보았는데요.

이렇게 규칙을 바로 찾아서 대입하는 것 보다는...

충분히 많이 생각해 보고 이렇게도 작성해 보고 저렇게도 작성하면서...

자신만의 규칙을 찾는 것이 더 많은 도움이 될것이라고 생각하네요.





사업자 정보 표시
원당컴퓨터학원 | 기희경 | 인천 서구 당하동 1028-2 장원프라자 502호 | 사업자 등록번호 : 301-96-83080 | TEL : 032-565-5497 | Mail : icon001@naver.com | 통신판매신고번호 : 호 | 사이버몰의 이용약관 바로가기