iOS/정보처리기사

[정보처리기사] C언어 - continue, break 개념과 for 반복문이 섞인 문제 박살내기 (feat. 다중for문)

Chafle 2022. 6. 1. 19:42
반응형
반복문의 옵션이 있다

 

1. continue

2. break

 


 

1. continue란?

 

 

- 더 이상 아래 문장을 실행하지 않고, 반복문 처음으로 돌아가라

- 반복문에서만 사용한다.

- continue가 계속적인 느낌이여서 아래로 내려가야 할 것같지만

- 반복문 '처음'으로 돌아가는 것 주의하자.

- 조건이 참일 때 continue 수행

 

 

2. break란?

- 반복문을 빠져나감

- 반복문에서도 사용가능하다

- switch나 if문 등에서도 사용 가능하다.

- 조건이 참일 때 break 수행

 

 

** 다중for문은 하단에서 다루겠습니다.

 


 

continue ex1

 

for(i=0, sum=0; i<3; i++) {

if(i==1) continue;

sum++;

}

printf("%d", sum)

 

 

해설

 

for문 구조 다시복습

 

 

for(초기값, 조건, 실행 후 증감) {

실행할 내용

}

 

  i i==1 sum 실행 후 증감 i ++
초기값 0   0  
i<3
0<3 참 -> if문 실행
  0==1 거짓
->거짓이므로 continue 안가고 if문을 나와서 sum++
1 1
i<3
1<3 참 -> if문 실행
1 1==1 -> 이므로 continue로 가서 i++수행   2
i<3
2<3 참-> if문 실행
2 2==1-> 거짓이므로 continue 안가고 if문을 나와서 sum++ 2 3
i<3
3<3 거짓 -> for문 빠져나온다
    2  

 

sum값 2

 


 

 

continue ex.2

 

#include<stdio.h>
int main(){

int i, sum = 0;

for(i=1, i<=10; i+=2) {

if(i%2 &&i %3) continue;

sum += i;

}

printf("%d", sum);

return 0;

}

 

 

해설

 

 

조건 i i%2 && i %3 sum sum+=i (sum = sum =i) i+=2(실행 후  증감)
초기값     0    
for i =1 1        
(i<=10)
1<=10 참이므로 if 수행
  1%2 && 1 %3 =
[1 && 1 = 1] -> continue
    i=3
(i<=10)
3<=10 참이므로 if수행
3 3%2 && 3%3 = 거짓
[1 && 0 = 0]
0 0+3 = 3 i=5
(i<=10)
5<=10 참이므로 if수행
5 5%2 && 5%3 =
[1 && 2 = 참] -> continue
    i=7
(i<=10)
7<=10 참이므로 if수행
7 7%2 && 7%3 =
[1 && 1 = 참] -> continue
    i=9
(i<=10)
9<=10 참이므로 if수행
9 9%2 && 9%3 = 거짓
[1 && 0 = 거짓]
3 3+9 = 12 i=11
(i<=10)
11<=10 거짓이므로 for문 빠져나온다.
    12    

 

 

for문 구조 또 복습

 

 

for(초기값, 조건, 실행 후 증감){

조건에 따른 실행

}

 

 

헷갈리는 POINT

- int i, sum = 0 -> i와 sum 둘 다 0이 아니고, i는 공간만 만들어놓고, sum에 0 할당

- i%2 && i%3 -> %가 나와서 자리수를 표현하는 게 아니고, 나눠서 몫과 나머지 중 나머지를 표현하는 의미

- i%2 && i%3이 참이면 continue를 수행해라-> 반복문 처음으로 돌아가라 -> i+=2로 올라가서 수행

- i%2 && i%3이 거짓이면 반복문 처음으로 돌아가지 말고 밑으로 수행 (이 문제에서는 sum +=) 

- ※ 주의  i%2 && i%3이 거짓일 때 continue로 안가고 하단 sum +=i 실행 한 다음에, 다시 위로 올라가서 for문을 바로 수행 하는 것이 아니라 실행 후 증감(i +=2)을 진행 해야한다

 

 

답 12

 

 

 


 

break ex.1

 

for(i=0, sum=0; i<3; i++) {

if(i == 1) break;

sum ++;

}

printf("%d", sum);

 

 

해설

 

  i i == 1 sum  sum++ i++ (수행 후 증감) 
초기값 0   0    
i<3
0<3 참 -> if문 수행
  0 == 1
거짓이므로 break수행 안하고 sum++ 수행
  1 1
i<3
1<3 참-> if문 수행
1 1 ==1
참이므로 break 수행 -> 반복문 빠져 나와서 printf수행
     
printf("%d", sum);       1  

 

sum: 1

 

 

- break를 만나는 순간 실행 후 증감 처리도 없이 그냥 for문 밖으로 빠져 나오면 된다.

 

 


 

 

다중 for문의 이해

쉽게... 구구단처럼 생각하자

 

 

 다중 반복문 ex

 

 

for( i = 0; i<3; i++) {

   for(j = 0; j<2; j++){

printf("i:%d, j: %d", i, j);

   }

}

 

i i<2 j j<2 print("i:%d, j: %d", i, j) j++내부 for 증감 i++ 외부 for증감
0 참 -> 다시 for문 만남 0 0<2
i: 0, j: 0 1->내부 for문 처음으로  
      1<2
i: 0, j: 1 2->내부 for문 처음으로  
      2<2
거짓
내부 for문 빠져나와서 외부 for문으로 가는데, 증감부터
    1
1 1<2 참 -> 내부for 들어가는데, j최초 값인 0부터다시 0 0<2
i: 1, j: 0 1->내부 for문 처음으로  
    1 1<2
i: 1, j: 1 2->내부 for문 처음으로  
    2 2<2
거짓
내부 for문 빠져나와서 외부 for문으로 가는데, 증감부터
    2
2 2<2 거짓 -> 드디어 외부 for문도 빠져나오면 끝          


i: 0, j: 0
i: 0, j: 1
i: 1, j: 0
i: 1, j: 1

 

 

 

반응형

 


 

 

continue, break, 다중for문 다 합친 문제

 

#include<stdio.h>

void main() {

int i, j, sum =0;

for(i=1; i<10; i++) {

   for(j=1; j<10; j++) {

        if(j%3 ==0) continue;

        if(i%4 == 0) break;

       sum++;

    }

 }

printf("%d", sum);

}

 

 

 

 

해설

 

  i i<10 j j<10 j%3==0 i%4==0 sum sum++ 수행 후 j++ 수행 후 i++
초기값             0      
  1 1<10
참 -> 내부 for문으로 드가자
1 1<10
참-> if문 수행
1%3
1==0 거짓이므로 continue수행 안하고 아래로
1%4
1==0
거짓이므로 break수행 안하고 아래로
0 1 2  
      2 2<10
참-> if문 수행
2%3
2==0 거짓이므로 continue수해 안하고 아래로
1%4
1==0
거짓이므로 break 수행 안하고 아래로
1 2 3  
      3 3<10
참-> if문 수행
3%3
0==0 참이므로
continue수행 -> j++로
      4  
      4 4<10
참->if문 수행
4%3
1==0 거짓이므로
continue수행 안하고 아래로
1%4
1==0
거짓이므로 break 수행 안하고 아래로
2 3 5  
      5 5<10
참->if문 수행
5%3
2==0 거짓이므로
continue수행 안하고 아래로
1%4
1==0
거짓이므로 break 수행 안하고 아래로
3 4 6  
      6 6<10
참->if문 수행
6%3
0==0 참이므로
continue수행 -> j++로
      7  
      7 7<10
참->if문 수행
7%3
1==0 거짓이므로
continue수행 안하고 아래로
1%4
1==0
거짓이므로 break 수행 안하고 아래로
4 5 8  
      8 8<10
참->if문 수행
8%3
2==0 거짓이므로
continue수행 안하고 아래로
1%4
1==0
거짓이므로 break 수행 안하고 아래로
5 6 9  
      9 9<10
참->if문 수행
9%3
0==0 참이므로
continue수행 -> j++로
      10  
      10 10<10
거짓이므로 내부 for문 빠져나오고, 빠져나오면서 i증감 수행
      6   2
  2

               
                     
                     

 

하......................

 

내부 for문 한 싸이클을 돌리면 엄청난 노가다가 앞으로 필요해지는 것이 느껴집니다..

이후에는 패턴을 분석해서 식을 찾는 것이 중요하겠습니다.

 

** sum 값이 더해진 곳을 보시면 j가 1~9까지 돌 때 3,6,9일 때 더해 지지 않고 1,2,4,5,7,8일 때 1씩 더해지는 것을 알 수 있습니다. (j가 1증가할 때마다 6증가)

 

** 식을 보면 i==0일 때 즉 i값이 4,8이 됐을 때 break문을 만나고 빠져나오게 되면 j값은 증가를 하지 않기 때문에

for문을 빠져나올 때 값만 제외시켜 주면 됩니다.

 

 

즉 표로 정리하면

i가 1증가할때마다 6씩 오르고

i가 9까지 증가하므로

 

i값 1 2 3 4 5 6 7 8 9
내부 for문에서의 sum의 합 6 6 6 0 6 6 6 0 6

 

 

sum값은 42

 

 

 

헷갈릴 만한 POINT

* i가 4일 때 break를 만나면, 내부 for문만 빠져나오게 되고 외부 for문은 여전히 실행한다.

 

 

 

 

 

 

연습용으로만 풀어보고... 다시는 뒤돌아보지 맙시다....
반응형