본문 바로가기

Programming/국비학원

220422 - 반복문 while, continue, break, 중첩반복문, 라벨링

반복문 while

 

  •  

while(조건){
..
}

 

=> db용 => 자료 수(탈출 조건) 몰라도 마지막 자료면 빠져나가도록 처리 (cf. for문은 i<=100 처럼 탈출 조건 지정돼있어야 함)

=> 무한루프 주의 / 조건이나 증감연산 실수로 입력 안 했을 시 계속 똑같은 값 반복

 

 

  •  
1
2
3
4
5
6
7
public static void main(String[] args) {
    int i=1;    //초기값
    while(i<=10) {    //조건
        System.out.println(i);
        i++;   //증감연산
    }
}
cs
//
1
2
3
4
5
6
7
8
9
10

 

 

 

continue
  • continue 실행시 그 다음 행으로 넘어가지 않고 다시 처음부터 반복문 수행

for (int i =1 ; i <= 10; i++) {
명령문1;
continue
명령문2;
명령문3;}

 

 

  •  

for (int i =1 ; i <= 10; i++) {
if (i%2==0) {
continue;    //짝수면 다음 행 실행하지 말고 처음으로 돌아가기
}
System.out.println(i);
}
//
1
3
5
7
9

 

 

 

break
  •  
1
2
3
4
5
6
7
public static void main(String[] args) {
for(int i=1; i<=10; i++) {
if (i==5) {
break;    //i가 5되면 탈출
}
System.out.println(i);
}}}
cs

 

 

 

중첩반복문
  •  
1
2
3
4
5
6
7
8
9
    public static void main(String[] args) {
        for (int i=1;i<=3;i++) {    //아래 내용 3번 반복
            for (int j=1;j<=5;j++) {    //아래 내용 5번 반복
                System.out.println("모두 파이팅!!!");    //3*5번 출력
            }
        }
    }
    
}
cs

 

 

 

라벨링

: 외부반복문을 라벨링할 시, 내부 반복문에서 탈출 시도할 때 외부 반복문까지 모두 탈출

 

 

  •  
1
2
3
4
5
6
7
8
9
10
11
    public static void main(String[] args) {
    Outerfor(int i=1;i<=5;i++) {
                for (int j=1;j<=5;j++) {
                System.out.println(i+" "+ j);
                if (i*j==15) {
                    break Outer;    //break문 실행으로 코드들 다 나감
                }
            }//내부
        }//외부
        System.out.println("프로그램 종료");
}
cs

 

//
1 1
1 2
1 3
1 4
1 5
2 1
2 2
2 3
2 4
2 5
3 1
3 2
3 3
3 4
3 5
프로그램 종료

 

 

 

 

 

  • 문제

3500이 넘으려면 1부터 몇까지 더해야 할까?

1
2
3
4
5
6
7
8
9
10
11
    public static void main(String[] args) {
        int sum = 0;
        for (int i=1;i<=100;i++) {
            sum+=i;
            if (sum>3500) {
                System.out.println("정답"+i);
                break;
            }
        }
    }
 
cs

 

 

=>오류 답안

1
2
3
4
5
6
7
8
9
10
    public static void main(String[] args) {
        int sum = 0;
        for (int i=1;i<=100;i++) {
            sum+=i;
            if (sum>3500) {
                break;
    }
        }
     System.out.println("정답"+i);    //for 문 내에서만 int i 가 정의됐는데 for 밖이므로 오류
            }
cs

 

 

=>해결

1
2
3
4
5
6
7
8
9
10
11
    public static void main(String[] args) {
        int sum = 0;
        int i;  
        for (i=1;i<=100;i++) {
            sum+=i;
            if (sum>3500) {
                break;
       }}//for문        
        System.out.println("정답"+i);
        System.out.println(sum-i);
    }
cs

//
정답84
3486

 

 

  •  

int num = 20;    //전역변수
{int age = 26;}    //지역변수 (괄호 안에서만 정의됨)
System.out.println(num);
System.out.println(age);    //오류 (괄호 밖)

 

 

=>해결

 

int num = 20;    //초기화
int age;    //선언
{age = 26;}
System.out.println(num);
System.out.println(age);

 

 

  • continue 사용 없이 홀수 출력

for (int i =1 ; i <= 10; i+=2) {
System.out.println(i);
}
//
1
3
5
7
9

 

 

  • 문제 : 1~100 합 (3의 배수 제외)
1
2
3
4
5
6
7
8
9
10
    public static void main(String[] args) {
        int sum = 0;
        for (int i =1;i<=100;i++) {
            if (i%3==0) {
                continue;
            }
            sum+=i;
        }//for문 종료
        System.out.println("1부터 100까지의 합= "+sum);    //for문 밖이므로 반복X
    }
cs

//조건 i<=100 다 실행한 후 자동 탈출하므로 break 필요 없음

 

 

  • 중첩반복문
1
2
3
4
5
6
7
public static void main(String[] args) {
        for (int i=1;i<=3;i++) { 
            for (int j=1;j<=5;j++) {   //j가 5 되어야 내부for 탈출 가능
                System.out.println(i + ", " + j);  
            }
        }
}
cs

//
1, 1 
1, 2
1, 3
1, 4
1, 5
2, 1
2, 2
2, 3
2, 4
2, 5
3, 1
3, 2
3, 3
3, 4
3, 5

=> 중첩반복문 작동 법 => 관련 문제에서 참고하기

 

 

  • 중첩반복문
1
2
3
4
5
6
7
8
    public static void main(String[] args) {
        for (int i=1;i<=5;i++) {
            for (int j=1;j<=5;j++) {
                System.out.print("*");
            }//내부for
            System.out.println();
        }//외부for
    }
cs

//
*****
*****
*****
*****
*****

 

 

  • 문제

*
**
***
****
*****
만들기

 

=>답안

1
2
3
4
5
6
7
8
    public static void main(String[] args) {
        for (int i=1;i<=5;i++) {
            for (int j=1;j<=i;j++) {
                System.out.print("*");    
            }//내부for
            System.out.println();
        }//외부for
    }
cs

 

 

  • 문제

*****
****
***
**
*
만들기 

 

=>내 풀이

1
2
3
4
5
6
7
8
    public static void main(String[] args) {
        for (int i=1;i<=5;i++) {
            for (int j=1;j<=6-i;j++) {
                System.out.print("*");    
            }//내부for
            System.out.println();
        }//외부for
    }
cs

 

 

=>다른 풀이

1
2
3
4
5
6
7
8
9
public static void main(String[] args) {
        for (int i=5;i>=1;i--) {
            for (int j=1;j<=i;j++) {
                System.out.print("*");    
            }//내부for
            System.out.println();
        }//외부for
}
 
cs

 

 

  • for문 밖 i
1
2
3
4
5
6
7
public static void main(String[] args) {
        int i;
        for (i=1;i<=10;i++) {   //i가 10보다 커지면 for문 밖으로 나감
            System.out.println("주말 잘 보내세요 "+i);
        }//for끝
        System.out.println("최종 i값? "+i);
}
cs

//
주말 잘 보내세요 1
주말 잘 보내세요 2
주말 잘 보내세요 3
주말 잘 보내세요 4
주말 잘 보내세요 5
주말 잘 보내세요 6
주말 잘 보내세요 7
주말 잘 보내세요 8
주말 잘 보내세요 9
주말 잘 보내세요 10
최종 i값? 11

 

 

  • 크리스마스 트리 문제
1
2
3
4
5
6
7
8
9
10
11
    public static void main(String[] args) {
        for (int i=1;i<=15;i++) {
            for (int b=15;b>=i;b--) {    
                System.out.print(" ");
            }
            for (int j=1;j<=i*2-1;j++) {
                System.out.print("*");    
            }//내부for
            System.out.println();
        }//외부for
    }
cs

//

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

 

 

  • 문제 (중첩 반복문)

돼지, 타조 각각 몇마리 있는지 구하기

총 17마리, 다리 총 56개

 

=>

1
2
3
4
5
6
7
8
9
10
11
12
13
    public static void main(String[] args) {
        int sum;
        for (int pig=1;pig<=17;pig++) {
            for (int ost=1;ost<=17;ost++) {
                sum = ost*2+pig*4;
                if(sum==56 && ost+pig==17) {
                    System.out.println("돼지 "+pig);
                    System.out.println("타조 "+ost);
 
                }
            }//내부
        }//외부
    }
cs

//
돼지 11
타조 6

 

 

  • 문제

구구단을 외우자

** 2 단 **
2 X 1 = 2
..
2 X 9 = 18

 

** 3 단 **
..
9 X 9 = 81

 

=>

1
2
3
4
5
6
7
8
9
10
11
 
    public static void main(String[] args) {
        System.out.println("구구단을 외우자");
        for (int i=2;i<=9;i++) {
                System.out.println("** "+i+" 단 **");
            for (int j=1;j<=9;j++) {
                System.out.println(i+" X "+j+" = "+i*j);
            }//내부
            System.out.println(" ");    //j반복문 끝나면 한칸 띄우기
        }//외부
    }
cs

 

 

  • 문제 : 1~100 합 (for문이 편리한 문제지만 while문 도전)
1
2
3
4
5
6
7
8
9
    public static void main(String[] args) {
        int i=1;
        int sum=0;
        while(i<=100) { //3. 2<=100이므로 while문 들어가 반복
            sum+=i; //1. i+sum=1+0=1
            i++; //2. i+i=1+1=2
        }
        System.out.println(sum);
    }
cs

 

 

  • 문제 : i*j 값이 15가 되면 반복문을 빠져나가시오

 

=>오류 풀이

1
2
3
4
5
6
7
8
9
    public static void main(String[] args) {
        for(int i=1;i<=5;i++) {
            for (int j=1;j<=5;j++) {
                if (i*j==15) {
                break;    //내부for에서만 벗어나 외부 for으로 돌아가게 됨
}   
            }//내부
        }//외부
        System.out.println("프로그램 종료");
    }
cs
 
 
 

=> break는 다시 외부for로 돌아가 i=4 부터 반복하므로 3*5, 5*3 모두 실행함

 

 

=>답 : 라벨링 사용

1
2
3
4
5
6
7
8
9
10
11
12
    public static void main(String[] args) {
    Outer: for(int i=1;i<=5;i++) {
                for (int j=1;j<=5;j++) {
                System.out.println(i+" "+ j);
                if (i*j==15) {
                    break Outer;    //라벨링, break 실행으로 반복문 종료
                }
            }//내부
        }//외부
        System.out.println("프로그램 종료");
    }
 
cs

//
1 1
1 2
1 3
1 4
1 5
2 1
2 2
2 3
2 4
2 5
3 1
3 2
3 3
3 4
3 5
프로그램 종료

 

 

 

  • 이전 예시에 라벨링 적용
1
2
3
4
5
6
7
8
9
10
11
12
13
    public static void main(String[] args) {
        int sum;
Exit:        for (int pig=1;pig<=17;pig++) {
            for (int ost=1;ost<=17;ost++) {
                sum = ost*2+pig*4;
                System.out.println(pig+ " "+ost);
                if(sum==56 && ost+pig==17) { //라벨링X => 답 찾아도 외부f로 나가 계속 계산
                    System.out.println("돼지 "+pig + "마리, 타조 " + ost + "마리");
                    break Exit;
                }
            }//내부
        }//외부
    }
//cs

//

1 1
~
11 6
돼지 11마리, 타조 6마리

 

 

  • 문제: 1~100 사이 숫자 맞추기 / 여러 차례 시도
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    public static void main(String[] args) {
        System.out.println("** 1~100 사이 숫자 맞추기 **");
int comNum= (int) (Math.random()*100)+1; //원래 랜덤은 소수로 나오므로 형변환
        int count = 0//몇 번 시도 후 맞췄는지
        Scanner sc = new Scanner(System.in);
        int myNum;
        while(true) {    //개발자가 조건에 true 넣음 -> 무한루프
            System.out.print("숫자 입력>> ");
            myNum = sc.nextInt();
            count++;
            if (myNum > comNum) {
                System.out.println("당신의 숫자가 커요. 좀 더 작은 수를 넣어보세요");
            } else if (myNum < comNum ) {
                System.out.println("당신의 숫자가 작아요. 좀 더 큰 수를 넣어보세요");
            } else {System.out.println("탈출하셨습니다."+ count);
            break   //무한루프 탈출
            }
        }//while문
        System.out.println("게임이 종료되었습니다.");
    }
cs

 

 

  • 문제: 주사위

1. 콘솔로 사용자가 주사위 번호 입력하게 함
2. 5번째까지 시도 가능 (컴퓨터가 랜덤 숫자 맞춤)

 

=>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("행운의 숫자 입력>> ");
        int myNum = sc.nextInt();
        int count = 0;
        int dice;
        while (true) {
            count++;
            dice = (int) (Math.random()*6+1);
            System.out.println(dice);
            if (myNum==dice) {break;}
            
        }//while문
        if (count<=6) {
            System.out.println("그래도 확률이 살아있군요");
        } else {
            System.out.println("확률이 바닥이군요");
        }
    }
cs

//
행운의 숫자 입력>> 4 (내가 입력) 
1
6
6
5
6
4
그래도 확률이 살아있군요

 

 

 

 

 

//복습 자체랑 복습글을 어떻게 해야 할지 고민을 많이 했는데, 대략

 

월 오전 11~2:30 전주 문풀

화~토 오전 11~2:30 복습

일 휴식

 

개념 및 문법

/

예시

 

식으로 해야겠다

 

 

내 목표: 논리 이해하고 코드 직접 만들기 => 10/30 => 3/30