[Study #07] 무한 반복문

    반응형

     

    01. 알고리즘

    • 의미 : 수학과 컴퓨터 과학, 언어학 또는 엮인  분야에서 어떠한 문제를 해결하기 위해 정해진 일련의 절차
    • 문제 풀이에 필요한 계산 절차 또는 처리 과정의 순서
    • 산법, 셈법, 계산 절차

    [ 활용 ] num01과 num02 값 바꾸기

    int num01 = 10;
    int num02 = 20;
    int temp = 0;
    
    temp = num01;
    num01 = num02;
    num02 = temp;
    
    
    System.out.println(num01); // 20
    System.out.println(num02); // 10

     

    02. While문

    • 조건식이 true일 경우 무한 반복
    • 조건식이 false가 되면 반복 행위를 멈추고 while문 종료
    • 특정 조건이 되면 탈출
    • 채팅이나 게임 등 무한 반복이 필요한 로직에서 활용

    [ 기본 ]

    int num = 1;
        while (num <= 10) {
            System.out.println("참입니다.");
            num++;
        }//'참입니다'가 10번 출력
        
        
    boolean b = !true;//오류 안 나는 이유 : b가 변수라서 변할 값이니까
    while (b) {
        System.out.println("출력문장");
    }
    System.out.println("while문 밖 문장입니다.");
    //값 : while문 밖 문장입니다.

     

    [ 예제 1 ] y값 받았을 때 종료하기

    package jun12;
    
    import java.io.IOException;
    
    public class While02 {
    	public static void main(String[] args) throws IOException {
    		
    		boolean quit = true;
    		while (quit) {//조건식을 먼저 검사하고 그 뒤에 출력함
    			System.out.println("게임을 시작합니다.");
    			System.out.println("게임중...");
    			System.out.print("게임을 종료할까요?(Y/N) ");
    			//enter는 \n \r이라는 뜻임
    			char input = (char) System.in.read();
    			System.in.read(); System.in.read(); //엔터처리 첫번째는 \n 두번째는 \r을 처리
    			
    			if (input == 'Y' || input == 'y') {
    				System.out.println("게임을 종료합니다.");
    				quit = !quit;
    			} 
    			System.in.skip(2);//입력값을 지워줌
    		}
    	}
    }

     

    [ 예제 2 ] 0점에서 100점 사이의 값을 받고 배열에 입력하기

    package jun12;
    
    import java.util.Arrays;
    import java.util.Scanner;
    
    public class While04 {
    	public static void main(String[] args) {
    
    		int[] score = new int[5];
    		Scanner sc = new Scanner(System.in);
    
    		for (int i = 0; i < score.length; i++) {
    			System.out.print(i + 1 + "번째 인원의 점수를 입력 : ");
    			int input = sc.nextInt();
    			while (!(input >= 0 && input <= 100)) {
    				System.out.print("다시 입력해주세요 : ");
    				input = sc.nextInt();
    			}
    			// 배열에 점수 입력해주세요.
    			score[i] = input;
    		}
    		// 출력
    		System.out.println(Arrays.toString(score));
    		sc.close();
    	}
    }

     

    03. do~while문

    • 명령 문장 실행 후 조건식 검사
    • while문과 순서가 반대로 실행
    • 값이 false가 나와서 1번은 값이 출력됨

    [ 기본 ]

    int num = 1;
    do {
        System.out.println("실행합니다.(do~while)"); // 명령문장
    } while (num < 0); // 조건식
    // 실행합니다.(do~while)

     

    [ 활용 ] while문과 do~while문의 차이

    package jun12;
    
    public class DoWhile02 {
    	public static void main(String[] args) {
    		boolean check = true;
    		
    		do {
    			System.out.println("do~while 출력문 " + check);
    		} while (check = false);// 1번 출력 됨
    		
    		
    		while (check = false) {
    			System.out.println("while 출력문 " + check);//출력 안됨
    		}
    	}
    }// do~while 출력문 true

     

    04. break문

    • 반복문인 for문, while문, do-while문, switch문의 실행을 중지할 때 사용
    • 반복문이 중첩되어 있을 경우 가장 가까운 반복문만 종료
    • 원하는 반복문을 종료시키려면 '라벨' 사용 (ex. break 라벨;)
      (Label : break나 continue가 실행할 반복문의 위위치를 이름으로 지정)

    [ 기본 ]

    for (int i = 1; i <= 10; i++) {
        if (i == 5) {
            break;//뒤에 코드가 오면 실행 안됨
        }
        System.out.print(i);// 1234

     

    [ 예제 ] 2 x i 가 10보다 작을 경우만 출력하기

    for (int i = 1; i < 10; i++) {
        if (i * 2 >= 10) {
            break;
        }
        System.out.println("2 x " + i + " = " + 2 * i);
    }
    /*
    2 x 1 = 2
    2 x 2 = 4
    2 x 3 = 6
    2 x 4 = 8
    */

     

    [ 활용 ] label 이용

    A: for (int i = 0; i < 10; i++) {// label활용 : A라는 이름을 가진 for문
        for (int j = 0; j < 10; j++) {
            System.out.print(i + "" + j + " ");
            if (j == 5) {
                break A;// A 반복문 탈출
            }
        }
    }// 00 01 02 03 04 05

     

    05. continue문

    • 반복문인 for문, while문, do-while문에서만 사용
    • 블록 내부에서 continue문이 실행되면 이하 실행문 무시하고 다시 반복문으로 이동

     

    [ 기본 ]

    package jun12;
    
    public class Continue {
    	public static void main(String[] args) {
    
    		for (int i = 1; i <= 10; i++) {
    			System.out.print(i);
    			if (i == 5) {
    				continue;// 이하 실행문을 무시하고 다시 반복
    			}
    			System.out.print(",");
    		}
    	}
    }// 1,2,3,4,56,7,8,9,10,

     

    [ 예제 ] 1에서 10 사이의 수 중 짝수만 출력

    for (int i = 1; i <= 10; i++) {
    	if ( i % 2 != 0) {
            continue;// 이하 실행문을 무시하고 다시 반복
        }
        System.out.print(i + " ");
    }// 2 4 6 8 10

     

    06. 활용 예제

     

    [ Q1 ] {75 95 85 100 50} 오름차순으로 배열하기

     

    - 방법 (1)

    package jun12;
    
    import java.util.Arrays;
    
    public class Test01 {
    	public static void main(String[] args) {
    
    		int[] a = { 75, 95, 85, 100, 50 };
    		int temp;
    
    		for (int i = 0; i < a.length; i++) {
    			for (int j = 0; j < a.length - 1; j++) {
    				if (a[j] > a[j + 1]) {
    					temp = a[j];
    					a[j] = a[j + 1];
    					a[j + 1] = temp;
    				}
    			}
    		}
    		System.out.println(Arrays.toString(a));
    	}
    }// [50, 75, 85, 95, 100]

     

     

    - 방법 (2)

    package jun12;
    
    import java.util.Arrays;
    
    public class Test01 {
    	public static void main(String[] args) {
    
    		int[] a = { 75, 95, 50, 85, 100 };
    		int temp;
    
    		while (a[0] > a[1] || a[1] > a[2] || a[2] > a[3] || a[3] > a[4]) {
    			// 정렬이 안 되어있는 경우를 찾는 식
    			for (int j = 0; j < a.length - 1; j++) {
    				if (a[j] > a[j + 1]) {
    					temp = a[j];
    					a[j] = a[j + 1];
    					a[j + 1] = temp;
    				}
    			}
    		}
    		System.out.println(Arrays.toString(a));
    	}
    }// [50, 75, 85, 95, 100]

     

     

    [ Q2 ] 어떻게 출력될지 예상하기

    package jun12;
    
    public class Test02 {
    	public static void main(String[] args) {
    		
    		for (int i = 0, j = 0; i <= 5; i++) { //i = 5    j = 15
    			j += i;
    			System.out.print(i);
    			if (i == 5) {
    				System.out.print(" = ");
    				System.out.print(j);
    			} else {
    				System.out.print(" + ");
    			}
    			
    		}
    	}
    }
    // 0 + 1 + 2 + 3 + 4 + 5 = 15 (예상)
    // 0 + 1 + 2 + 3 + 4 + 5 = 15

     

    [ Q3 ] 출력 결과가 00001010이 나오도록 빈칸 채우기

    package jun12;
    
    public class Test03 {
       public static void main(String[] args) {
          int[] a = new int[8];
          int i = 0;
          int n = 10;
    
          while (1.) {
             a[i++] = (2.);
             n /= 2;
          }
    
          for (i = 7; i >= 0; i--) {
             System.out.print(a[i]);
          }
       }
    }

    - 답 : 1. n > 0     2. n % 2

     

     

    [ Q4 ] for문 무한반복하기

    package jun12;
    
    public class For {
    	public static void main(String[] args) {
    
    		for (int i = 0; i < 10; i++) {
    			System.out.println("반복합니다");
    			i = 0;
    		}
    
    		for (int i = 0; i < 10; i--) {
    			System.out.println("반복합니다");
    		}
    		
    		for ( ;  ; ) {//계속 무한 반복함
    			System.out.println("반복합니다");
    		}
    
    	}
    }

     

    [ Q5 ] for문에 숫자 없이 10번 반복하게 하기

    package jun12;
    
    public class For {
    	public static void main(String[] args) {
    
    		for (int i = 'A'; i < 'K'; i++) {// char를 int에 넣음
    			System.out.println("반복합니다");
    		}
    
    	}
    }

     

    [ Q6 ] 10 이하로 짝수만 출력

    package jun12;
    
    public class Test06 {
    	public static void main(String[] args) {
    		for (int i = 1; i <= 10; i++) {
    			if (i%2 == 0) {
    				System.out.println(i);
    			}
    		}
    	}
    }
    /*
    2
    4
    6
    8
    10
    */

     

    [ Q7 ] 3x3 배열에 1~9까지 숫자 랜덤하게 입력하기

     

    - 방법 (1)

    package jun12;
    
    import java.util.Arrays;
    
    public class Sam {
    	public static void main(String[] args) {
    
    		int[][] sam = new int[3][3];
    		/*
    		 * [0,0] [0,1] [0,2] 
    		 * [1,0] [1,1] [1,2] 
    		 * [2,0] [2,1] [2,2]
    		 */
    		for (int i = 0; i < sam.length; i++) {
    			for (int j = 0; j < sam[i].length; j++) {
    				int temp = (int) (Math.random() * 9) + 1;
    				System.out.println("뽑은 숫자 : " + temp);
    
    				// 검사 for문 sam[1][0] == temp;
    				boolean check = false;
    				A: for (int k = 0; k < sam.length; k++) {
    					for (int k2 = 0; k2 < sam.length; k2++) {
    						if (temp == sam[k][k2]) {
    							check = true;//중복되는게 있음
    							break A;
    						}
    					}
    				} // 검사 for문 끝
    
    				if (check) {
    					j--;// 다시 뽑기
    				} else {
    					sam[i][j] = temp;// 입력해주기
    				}
    			}
    		}
    		for (int[] is : sam) {
    			System.out.println(Arrays.toString(is));
    		}
    	}
    }

     

    - 방법 (2)

    package jun12;
    
    import java.util.Arrays;
    
    public class Sam02 {
    	public static void main(String[] args) {
    		
    		int[][] sam = new int[3][3];
    		int[] number = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };//입력숫자
    		
    		//입력숫자에서 랜덤하게 한 숫자를 뽑아
    		//순차 입력하고 뽑힌 입력 숫자는 0으로 바꾸기
    		//입력 숫자 뽑기에서 0이면 다시 뽑기
    		int temp;//index 용도
    		for (int i = 0; i < sam.length; i++) {
    			for (int j = 0; j < sam.length; j++) {
    				do {
    					temp = (int) (Math.random() * 9) ;
    				} while (number[temp] == 0);
    				sam[i][j] = number[temp];//저장하기
    				number[temp] = 0;//중복 방지하기 위해서
    				
    			}//배열 내부측
    		}//배열 외부측
    		
    		for (int[] is : sam) {
    			System.out.println(Arrays.toString(is));
    		}
    	}
    }

     

    - 방법 (3)

    package jun12;
    
    import java.util.Arrays;
    
    public class Sam03 {
    	public static void main(String[] args) {
    		
    		int[][] sam = new int[3][3];
    		//index를 뽑아서 해당 위치에 1~9 순차적으로 입력하기
    		for (int i = 1; i < 10; i++) {//입력할 숫자
    			int r1 = (int) (Math.random() * 3);//0 1 2
    			int r2 = (int) (Math.random() * 3);//0 1 2
    			if (sam[r1][r2] == 0) { //초기값이 비어있어?
    				sam[r1][r2] = i;
    			} else {
    				i--;//중복발생으로 다시 뽑기
    			}
    		}
    		for (int[] is : sam) {
    			System.out.println(Arrays.toString(is));
    		}
    	}
    }

     

    [ Q8 ] 중복 없이 로또 번호 뽑기

     

    - 방법 (1)

    package jun12;
    
    import java.util.Arrays;
    
    public class Lotto {
    	public static void main(String[] args) {
    
    		int[] lotto = new int[6];// 1~45
    
    		for (int i = 0; i < lotto.length; i++) {
    			lotto[i] = (int) (Math.random() * 45) + 1;
    
    			for (int j = 0; j < lotto.length; j++) {
    				if (lotto[j] == lotto[i]) {
    					j--;
    					break;
    				}
    			}
    		}
    		int temp;
    		for (int i = 0; i < lotto.length; i++) {
    			for (int j = 0; j < lotto.length - 1; j++) {
    				if (lotto[j] > lotto[j + 1]) {
    					temp = lotto[j];
    					lotto[j] = lotto[j + 1];
    					lotto[j + 1] = temp;
    
    				}
    			}
    		}
    
    		// print
    		System.out.println(Arrays.toString(lotto));
    	}
    }

     

    - 방법 (2) : set 이용하기

    package jun12;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.HashSet;
    import java.util.Set;
    
    public class Lotto {
    	public static void main(String[] args) {
    
    		Set<Integer> lotto = new HashSet<Integer>();
    		
    		while (lotto.size() < 6) {
    			lotto.add( (int) (Math.random() * 45) + 1 );
    		}
    		System.out.println(lotto);//출력
    		
    		//정렬하기
    		ArrayList<Integer> lottoSort = new ArrayList<Integer>(lotto);
    		Collections.sort(lottoSort);
    		System.out.println(lottoSort);
    	}
    }

     

     

    참고자료
    신용권, '혼자 공부하는 자바'
    반응형

    댓글