시간이 비교적 여유로울 때 알고리즘 공부를 하면 좋을 듯 싶어서,
회사에서 남는 시간에 알고리즘 공부를 하기로 했다.
참고서적은 Do it! 자료구조와 함께 배우는 알고리즘 입문 : 자바 편


알고리즘 - 반복

  • 1부터 n까지의 정수 합 구하기
    ‘1+2+…+n’처럼 1부터 n까지의 정수 합 구한다.
          public void sumWhile() {
                  System.out.println("1부터 n까지의 합을 구합니다.");
                  System.out.print("n의 값 : ");
                  int n = stdIn.nextInt();
    				
                  int sum = 0;
                  int i = 1;
    				
                  while(i <= n) { //i가 n이하면 반복
                      sum += i; //sum에 i를 더한다
                      i++; //i값을 1만큼 증가시킴
                  }
                  System.out.println("1부터 " + n + "까지의 합은 " + sum + "입니다.");
              }
    

    실행결과
    이미지1


  • while 반복
    어떤 조건이 성립하는 동안 처리를 반복하여 실행하는 것을 루프(Loop)라고 부른다.
    이때 while문은 실행 전에 반복을 계속할지를 판단하는데, 이것을 ‘사전 판단 반복 구조’라 한다.
    제어식의 평가값이 0이 아니면 프로그램 명령문이 반복된다.

    while(제어식) 명령문

    반복의 대상이 되는 ‘명령문’을 문법적으로는 루프 본문이라 한다.
    위 프로그램을 순서도로 나타내면 다음과 같다.
    이미지2
    주황색 부분이 바로 루프 본문이다.


    이미지3
    반복해서 실행할 때마다 변수 i의 값이 증가되어 1씩 늘어난다. 변수 sum의 값은 ‘루프 본문을 수행하는 동안의 합’이고,
    변수 i의 값은 ‘다음에 더하는 값’ 이다.
    즉, i가 5일때 변수 sum의 값은 ‘1부터 4까지의 합’인 10임.
    그리고 i의 값이 n을 초과할때 while문의 반복이 종료되므로 최종 i값은 n이 아니라 n+1이다.






  • for문 반복
    하나의 변수를 사용하는 반복문은 while문보다는 for문을 사용하는 것이 좋다.
    1부터 n까지의 정수 합 구하기 를 for문으로 수정하면 다음과 같다.
          public void sumFor() {
              System.out.println("1부터 n까지의 합을 구합니다.");
              System.out.print("n의 값 : ");
              int n = stdIn.nextInt();
    			
              int sum = 0; //합
              for(int i=1; i<=n; i++) {
                  sum += i; //sum에 i를 더한다
              }
              System.out.println("1부터 " + n + "까지의 합은 " + sum + "입니다.");
          }
    




    이것을 순서도로 나타내보자.
    이미지4
    육각형의 루프 범위는 반복의 시작, 종료 지점을 가리키는 것으로
    같은 이름을 가진 루프 시작과 루프 종료로 둘러싸인 부분을 반복한다.

    for(초기화부분; 제어식; 업데이트 부분) 명령문
    초기화 부분은 for문을 실행하기 전 한 번만 실행하고,
    제어식을 평가한 값이 true면 for문의 명령문을 반복한다.
    명령문을 실행한 다음에는 업데이트 부분을 실행한다.







  • 양수만 입력하기
    위의 프로그램에 음수인 -5를 입력하면 제대로 된 값이 출력되지 않는다.
    그래서 양수만을 받도록 프로그램을 수정하자!
          public void sumForPos() {
              int n;
              System.out.println("1부터 n까지의 합을 구합니다.");
    			
              do{
                  System.out.print("n의 값 : ");
                  n = stdIn.nextInt();
              }while (n<=0);
    			
              int sum = 0;
              for(int i=1; i<=n; i++) {
                  sum += i;
              }
              System.out.println("1부터 " + n + "까지의 합은 " + sum + "입니다.");
          }
    

    사용자가 0이하의 숫자를 입력하면 다시 숫자를 입력받는다.


    결과화면
    이미지5
    do문은 일단 루프 본문을 한 번 실행한 다음에 계속 반복할 것인지를 사후에 판단하는 반복문이다.
    변수 n에 입력한 값이 0 이하면 루프 본문이 반복 실행되므로
    do문이 종료될 때 n의 값은 반드시 양수여야 한다.


  • 사전 판단 반복과 사후 판단 반복의 차이점
    사전 판단 반복문은 처음에 제어식을 평가한 결과가 0이면 루프 본문은 한 번도 실행되지 않는다.
    이와 달리 사후 판단 반복문인 do문은 루프 본문이 반드시 한 번 실행된다.