저희가 아이들과 공부를 하다 보면 별을 찍는 규칙을 많이 어려워 하더라구요.
별을 찍는 형태는 다음과 같은 형태가 나타납니다.
-*****
--***
---*
이런 경우 프로그램은 다음과 같이 반복문을 구성해 주어야 합니다.
먼저 행이 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 일때
i |
-반복횟수(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가 되는 것을 확인할 수가 있습니다.
이렇게 규칙을 찾게 되면 규칙을 찾는 것 만으로도 별을 찍을수 있겠네요.
처음 별 찍는 학생들이 좀 어려워 하는 것 같아서 규칙을 찾아 보았는데요.
이렇게 규칙을 바로 찾아서 대입하는 것 보다는...
충분히 많이 생각해 보고 이렇게도 작성해 보고 저렇게도 작성하면서...
자신만의 규칙을 찾는 것이 더 많은 도움이 될것이라고 생각하네요.
'강의자료 > 텍스트기반SW' 카테고리의 다른 글
파이썬으로 웹 크롤링 하고 바드에게 묻고 답하기 (2) | 2023.07.05 |
---|---|
구글 바드 API 파이썬에서 사용하기 (18) | 2023.06.28 |
C언어에서 문자열이 한글인지 확인 하는 방법 (8) | 2018.08.28 |
코드블럭(Code Block) 자동완성 기능 설정 (5) | 2018.08.22 |
코드블럭에서 can't find compiler executable in your search path (GNU GCC compiler) 에러 발생시 (9) | 2018.05.03 |