본문 바로가기

Java 기본 개념

자바를 잡아라 제 6장 - 끝이 어딘지 모를 땐 현재에 집중해라

728x90

[ 2022년 9월 27일 화요일 ]

  • 중첩 반복문 ★ 중첩 반복문을 구현할 때에는 범위를 정확하게 파악해야 함


[ for문의 이중 구조 ]

for ( 초기값; boolean형 조건식; 반복 표현식 ) {

for ( 초기값; boolean형 조건식; 반복 표현식 ) {

반복할 실행문; }

}


Example - (1) 중첩 반복문으로 통해 다음과 같은 모양을 출력

public class MultiForEx02 {
	
	 public static void main(String[] args) {
		
		 // 회전할 때마다 횟수가 변하는 중첩반복문
		 /*
		  * 
		  *  	    *
		  * 	   ***
		  * 	  *****
		  * 	 *******
		  * 	*********
		  *  1행 1번 / 2행 3번 /3행 4번
		  */
		 int star = 5;
		 for(int i =1 ; i<= star; i++) {
			 
			 //공백
			 for(int j=1; j<=star-i; j++) {
			 System.out.print(" ");
			 }
			 
			 //별
			 for(int j=1; j<=(i*2)-1; j++) {
				 System.out.print("*");
			 }
			 
			 System.out.println();
		 }
	 
		 System.out.println("-----------------------------------------------");
		 
		 
		 
		 
		 for(int i =1 ; i<= star; i++) {
			 
			 //공백
			 for(int j=1; j<=i-1; j++) {
			 System.out.print(" ");
			 }
			 
			 //별            // j = 2(star-i)+1
			 for(int j=1; j<=(-2*i)+11; j++) {
				 System.out.print("*");
			 }
			 System.out.println();
		 }
	}
	 
}



         public class MultiForEx02 {

               public static void main(String[] args) {                          i = 1     j = 1, 2, 3, 4      :    1층에 공백 4칸
                      int star = 5;                                                              i = 2     j = 1, 2, 3          :    2층에 공백 3칸
                         for ( int i = 1 ; i <= star; i++ ) {                             i = 3    j = 1, 2               :    3층에 공백 2칸
                            //공백                                                                  i = 4    j = 1                   :    4층에 공백 1칸
                          <1>   for ( int j = 1; j <= star-i; j++ ) {                  i = 5    j = 0                   :   5층에 공백 0칸
                                    System.out.print(" ");
                               }

                            //별                          // 별의 갯수가 홀수개이기 때문에 범위 조정

                           <2>  for ( int j = 1; j <= (i*2)-1; j++ ) {      i = 1      j = 1                                     :  1층에 별 1개
                                    System.out.print( " * " );                   i = 2     j = 1, 2, 3                             :  2층에 별 3개
                               }                                                               i = 3     j = 1,2, 3, 4, 5                     :  3층에 별 5개
                                   System.out.println();                          i = 4     j = 1,2, 3, 4, 5, 6, 7             :  4층에 별 7개 
                              }                                                                i = 5     j = 1,2, 3, 4, 5, 6, 7, 8, 9    :  5층에 별 9개
  
                 System.out.println("-----------------------------------------------");

                          for ( int i = 1 ; i <= star; i++ ) {                        i = 1     j = 0                    :    1층에 공백 0칸
                          //공백                                                               i = 2     j = 1                    :    2층에 공백 1칸
                            <1>   for ( int j = 1; j <= i-1; j++ ) {               i = 3     j = 1, 2                :    3층에 공백 2칸
                                   System.out.print(" ");                             i = 4     j = 1, 2, 3           :    4층에 공백 3칸
                           }                                                                       i = 5     j = 1, 2 ,3, 4       :    5층에 공백 4칸


                            //별                        // j의 범위 등차수열을 통해 구함

                            <2>  for ( int j = 1; j <= ( -2*i )+11; j++ ) {   i = 1     j = 1,2, 3, 4, 5, 6, 7, 8, 9     :  5층에 별 9개
                                   System.out.print( " * " );                        i = 2     j = 1,2, 3, 4, 5, 6, 7             :  4층에 별 7개
                            }                                                                      i = 3     j = 1,2, 3, 4, 5                      :  3층에 별 5개
                                    System.out.println();                             i = 4     j = 1,2, 3                               :  2층에 별 3개
                   }                                                                               i = 5     j = 1                                      :  1층에 별 1개
        }

             등차수열  : 연속하는 두 항의 차가 일정한 수열

                     공차 d, 첫 항 a1일 때   a1 + ( n-1 ) d 




Example (2) - 입력받은 수까지 소수 출력 예) 5 >> 2, 3, 5
( 입력받은 수까지 반복하고, 각 수를 자기자신까지 나누면서 약수의 개수가 2개인 수 )

import java.util.Scanner;

public class MultiForEx03 {
	
	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
		
		for(int i=1; i <= num; i++) {
			
			int count = 0; // count에 대한 초기값을 0으로
			for(int j =1; j <= i; j++) {
				
				System.out.println(i + "-" + j);
				if(i % j == 0) {
					count++;
				}
			}
			if(count == 2) {
				System.out.println(i);
			}
		
	}
		
}
}


import java.util.Scanner;
public class MultiForEx03 {
public static void main(String[ ] args) {

1) 입력받은 수까지
Scanner sc = new Scanner(System.in); // Scanner로 정수 입력 받기
int num = sc.nextInt();

2) 소수 출력
for ( int i = 1; i <= num; i++ ) {
int count = 0; // 약수의 갯수를 의미하는 변수
for( int j = 1; j <= i; j++ ) { // j 가 i 까지인 이유: 자기 자신까지 나누기 위해
(즉, 소수는 1 포함 자기자신만을 약수로 가진 것을 의미하기 때문)
if ( i % j == 0 ) {
count++;
}
}

f ( count == 2 ) { // 소수는 1과 자기자신으로 이루어져 약수의 갯수가 총 2개
System.out.println(i);
}
}
}
}


  • 향상된 for 루프 (Enhanced for loop)

    [ 향상된 for문의 구조 ]

for ( 배열의 값을 담을 변수 : 배열의 이름 ) {
실행문;
}


int [ ] arr= {1,2,3,4,5};

// 일반 for
for ( int i = 0; i < arr.length; i++ ) { // 초기값; 조건식; 증감식
System.out.println(arr[i]);
}

// 향상된 for
for ( int a : arr ) { // arr의 배열의 요소들을 a에 저장
System.out.println(a);
}

// 향상된 for - 문자열 배열
String[ ] sArr = {"월", "화", "수", "목","금", "금", "금"};

for ( String s : sArr ) {
System.out.println(s);
}


Example (1) - 향상된 for문을 통해 배열의 합계와 평균 구하기

public class EnhanceForEx {
	
	 public static void main(String[] args) {
		
		int [] score = {34, 54, 23, 53, 65};
		int sum = 0;
		double avg = 0;
		for(int S : score) {
			sum+= S; //누적
			avg = (double)sum/score.length;//type casting
		}
		System.out.println(sum);
		System.out.printf("%.2f", avg);
		//소수 2자리까지 표현하는 방법 
		//1. printf 사용
		//2. 문자열
		
	}
}



int [ ] score = {34, 54, 23, 53, 65};

int sum = 0;
double avg = 0;

for ( int S : score ) { // 정수 S 변수에 score 배열 저장

sum+= S; // 누적
avg = (double) sum / score.length; // type casting
: 정수인 sum과 정수인 배열의 길이를 나누었을 때
실수가 나올 경우를 대비해 타입 캐스팅을 해야 함
}
System.out.println(sum);
System.out.printf("%.2f", avg);