언어/C언어

[C/C++] 반복문 for문에 대한 이해 - 마무리는 별찍기 풀이 및 코드

REAKWON 2022. 3. 29. 18:58

반복문 for

C언어에는 여러 반복문이 존재합니다. for문, while문, do ~ while문이 있지요. 오늘은 가장 흔하게 쓰이는 for문에 대하여 이야기해보도록 하겠습니다. 

for문에 대한 형식은 일반적으로 아래와 같은 형태입니다.

1. 초기화 식이 먼저 수행됩니다. 이는 for문 최초 1회만 수행됩니다.

2. 이후 조건식을 보고 true이며 for문 내부에 있는 코드를 수행하고, false이면 for문을 멈추고 빠져나옵니다.

3. 조건식이 참일 경우 수행되는 내부 부분입니다.

4. 이후 증감식을 수행한 후 다시 2의 조건식에 맞는지 확인합니다. 

이후 2 ~ 4의 반복입니다.

 

예 ) 1~10까지의 합

이러한 기본 형식을 지킨 1부터 10까지 모두 더한 수를 구한 예제입니다.

#include <stdio.h>

void main() {
	int i;
	int sum = 0;
	for (i = 1; i <=10; i++) {
		sum += i;
	}
	printf("1부터 10까지의 합 : %d\n", sum);
}

 

중첩 for문 

for문안에 for문이 등장하여 중복적으로 반복문을 수행할 수도 있습니다. 이를 중첩 for문, 혹은 2중 for문이라고 합니다. 원리는 간단합니다. 수행 부분이 내부 for문으로 바뀌는 거거든요. 아래는 이와 관련된 구구단의 예제입니다.

int i, j;
for (int i = 2; i <= 9; i++) {
	for (int j = 1; j <= 9; j++) {
		printf("%d * %d = %d\n", i, j, i * j);
	}
	printf("\n");
}

 

for문의 제어 - continue, break 

상황에 따라서 이번 수행부분은 건너뛰거나, 아예 for문을 멈춰야하는 상황이 발생할 수 있습니다. 이럴 경우 쓰이는 키워드가 if와 함께 continue와 break입니다.

continue : 이후 for문의 실행부분을 건너뜁니다.

break : break가 있는 for문을 종료시킵니다. 2중 for문의 경우 break가 등장하는 for문을 멈춰버립니다.

예 ) 1~10까지 짝수만 출력

for (int i = 1; i<=10; i++) {
	if (i % 2 == 1) continue;
	printf("%d \n", i);
}

 

예) 특정수와 일치하는 배열의 index 찾기

void main() {
	
	int numbers[] = { 5,4,2,1,9,11 };
	int found_index = -1;
	for (int i = 1; i<sizeof(numbers); i++) {
		if (numbers[i] == 9) {
			found_index = i;
			break;
		}
	}
	if (found_index != -1) {
		printf("9의 배열 index:%d\n", found_index);
	}
	else {
		printf("9를 찾을 수 없음\n");
	}
}

 

for문의 다양한 사용법 

for문은 일반적으로 이런식으로 사용한다는 것을 보여드렸습니다. 초기화식, 조건식, 증감식은 모두 생략이 가능합니다. 아래와 같이 다양하게 사용할 수 있습니다.

for(;;) // 무한 루프
for(i=1;;) //무한 루프
for(;i<5;i++) //초기화 구문 생략
for(;;i++)	//i가 1씩 증가하는 무한루프
for(i=1,j=1;;i++,j++)	//두가지 변수를 ,로 동시에 증감이 가능

 

for문 활용 - 별 출력

for문의 가장 대표적인 예제로는 별찍기가 있는데요. 한번 풀어보도록 합시다. 처음 몇개는 쉬우니까 우선 풀이는 생략하고 코드만 올리도록 하겠습니다.

1. 

*
**
***
****

아래는 코드입니다.

void main() {
	printf("*\n");
	printf("**\n");
	printf("***\n");
	printf("****\n");
}

장난이구요. 

void main() {
	int i, j;
	for (i = 1; i <= 4; i++) {
		for (j = 1; j <= i; j++)
			printf("*");
		printf("\n");
	}
}

 

2.

****
***
**
*
void main() {
	int i,j;
	for (i = 4; i > 0; i--) {
		for (j = 1; j <= i; j++)
			printf("*");
		printf("\n");
	}
}

 

3. 

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

여기서부터 좀 많이 헤메실수 있어서 풀이방법도 기재해드립니다. 우선 코드분석해보시고 풀이를 봐주세요.

#include <stdio.h>

void main() {
	int i, j, height;
	scanf("%d", &height);
	for (i = 1; i <= height; i++) {
		for (j = 1; j <= height - i; j++) //공백 먼저 출력
			printf(" ");
		
		for (j = 1; j <= i * 2 - 1; j++)  //*출력
			printf("*");
		printf("\n");
	}
}

 

우선 i는 *과 공백을 포함한 한 줄을 의미합니다. 공백과 별을 어떻게 출력하는지는 아래와 같은 규칙을 갖게 됩니다. 아래의 그림은 높이가 4인 삼각형 모양의 별을 나타내었습니다.

i가 1일 경우 ) 우선 공백이 3개 출력되고, 별이 1개 출력이 됩니다.

i가 2일 경우 ) 공백이 2개 출력되고, 별이 3개 출력됩니다.

i가 3일 경우 ) 공백이 1개, 별이 5개 출력됩니다.

i가 4일 경우 ) 공백이 0개, 별이 7개 출력됩니다.

자, 이제 일반화하게 되면, 아래와 같은 규칙을 얻게 되지요.

공백 : height - i 까지 출력

별 : i*2 -1까지 출력

그래서 위의 코드와 같이 쓸 수 있습니다.

4.

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

이거는 i를 처음부터 height값으로 놓고 --i로 거꾸로 돌리면 됩니다.

void main() {
	int i, j, height;
	scanf("%d", &height);
	for (i = height; i >= 0; i--) {
		for (j = 1; j <= height - i; j++) //공백 먼저 출력
			printf(" ");
		
		for (j = 1; j <= i * 2 - 1; j++)  //*출력
			printf("*");
		printf("\n");
	}
}

 

4.

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

 

위의 두 코드를 합치면 되는데, 중간에 같은줄이 두개 나오기 때문에 밑에는 height -1로 하여 한번 빼줍시다.

	for (i = 1; i <= height; i++) {
		for (j = 1; j <= height - i; j++) //공백 먼저 출력
			printf(" ");

		for (j = 1; j <= i * 2 - 1; j++)  //*출력
			printf("*");
		printf("\n");
	}

	for (i = height-1; i >= 0; i--) {
		for (j = 1; j <= height - i; j++) //공백 먼저 출력
			printf(" ");

		for (j = 1; j <= i * 2 - 1; j++)  //*출력
			printf("*");
		printf("\n");
	}

 

이상으로 별까지 출력하는 코드로 for문을 활용해보았습니다. for문은 배열과 같이 많이 쓰이기 때문에 반드시 알아야하는 반복문입니다.

반응형