학원/수업 기록

switch, 반복문(while, do~while, for), 다중 반복문, 마름모 만들기, 별 찍기

60cod 2022. 6. 17. 11:50

switch

특정 값일 경우 해당 내용들을 실행하는 형태를 가진 조건문.

값이 들어오게 되면 해당 값과 같은지를 비교하여 이후 내용을 실행하는 형태로 구성.

switch (조건) {
  case 값1 : 내용1;  //조건과 값1이 같으면 내용1과 아래 내용들을 실행한다.
  case 값2 : 내용2;
  ...
  default : 내용n;  //기본적으로 내용n을 실행한다.(선택)
}

default가 if문의 else같은 역할.

if문은 조건을 직접 처리했다면 switch문은 걸리기 시작하면 뒤까지 다 실행된다.

-> break로 중단시켜줌.

switch (조건) {
  case 값1 : 내용1;  //조건과 값1이 같으면 내용1을 실행한다.
        break;       //switch문 종료.
  case 값2 : 내용2;
        break;
  ...
  default : 내용n;  //기본적으로 내용n을 실행한다.(선택)
}

위와 같이 break를 사용하면 해당 case의 내용만 실행하고 switch문을 종료한다.

따라서 다음 내용들을 실행할 필요가 없는 경우에는 반드시 break로 종료시켜줘야 한다.

 

switch문은 if문과 달리 값이 일치할 경우에만 처리되기 때문에

범위를 고려하여 조건문을 구현해야 한다.

 

 

 

예제)

public class Test06 {

	public static void main(String[] args) {
		int a = 3;
		
		switch(a) {
		case 1 : System.out.println("1이다.");
		case 3 : System.out.println("3이다.");
		default : System.out.println("1도 3도 아니다.");
		}
	}
}

출력 결과 :

3이다.
1도 3도 아니다.

 

public class Test06 {

	public static void main(String[] args) {
		int a = 1;
		
		switch(a) {
		case 1 : System.out.println("1이다.");
		case 3 : System.out.println("3이다.");
		default : System.out.println("1도 3도 아니다.");
		}
	}
}

출력 결과 :

1이다.
3이다.
1도 3도 아니다.

 

break가 없기 때문에 아래 내용까지 다 실행되어버림.

 

 

public class Test06 {

	public static void main(String[] args) {
		int a = 1;
		
		switch(a) {
		case 1 : System.out.println("1이다.");
				break;
		case 3 : System.out.println("3이다.");
				break;
		default : System.out.println("1도 3도 아니다.");
		}
	}
}

출력 결과 :

1이다.

 

 

 

 

break는 해당 구문을 종료한다는 의미.
default는 다음 내용이 없기 때문에 break를 걸어줄 필요가 없다.

break를 클릭해보면 아래와 같이 어느 구문에 걸렸는지 알 수 있다.

 

 

 

성적 계산 예제)

public class Test06 {

	public static void main(String[] args) {
		int score = 78;
		
		//switch를 사용하여 성적을 구하시오.
		//90~100:A, 80~89:B, 70~79:C, 60~69:D, 나머지 F
		switch(score/10) {
		case 10 : 
		case 9 : System.out.println("A");
				break;
		case 8 : System.out.println("B");
				break;
		case 7 : System.out.println("C");
				break;
		case 6 : System.out.println("D");
				break;
		default : System.out.println("F");
		}
	}
}

나머지는 다 F를 줘야 하니 default에 F 지정하기.

100점의 경우, 

case 10 과 case 9 는어차피 동일한 내용("A"출력)을 구현하고,

switch는 break가 없으면 아래 내용을 실행하는 특성을 가지므로

case 10 의 내용을 지워서 같이 실행시킬 수 있음.

 

 

+응용)

플러스 성적 추가

5로 스코어 나누고 케이스를 20, 19, 18, 17,...

범위 개수 만큼 나누면 쉽다.

public class Test06 {

	public static void main(String[] args) {
		int score = 95;
		
		//switch를 사용하여 성적을 구하시오.
		switch(score/5) {
		case 20 : 
		case 19 : System.out.println("A+");
				break;
		case 18 : System.out.println("A");
				break;
		case 17 : System.out.println("B+");
				break;
		case 16 : System.out.println("B");
				break;
		//...생략
		default : System.out.println("F");
		}
	}
}

 

 

 

 

반복문

특정 작업을 지정한 횟수만큼 실행하는 것.

작업과 횟수가 중요하다.

세 가지 요인 : 1)초기값 2)조건 3)증감값

 

 

1. while

조건이 true인 경우 내용 실행.

int a = 1;
while(a <= 10) {

    System.out.println(a);

    a++;
}

출력 결과 : 1부터 10까지

 

 

while(true) {
    System.out.println("loop : " + a);
    a++;
}

출력 결과 : 무한 루프... 자바가 계속 구동됨.

true를 실행하는 경우 / 증감값이 없는 경우 / 증감값을 잘못 준 경우 -> 무한루프

 

 

무한루프는 if문으로 멈출 수 있다.

if는 끝낼 수 있는 내용이 없어서 break 주면 while 구문을 종료.

while(true) {
    System.out.println("loop : " + a);
    a++;
    if(a == 100) {
        break;
    }
}

출력 결과 : 'loop : 99' 까지 찍고 종료.

이 경우, a == 100 이 조건이 된다.

 

 

2. do~while

기본적으로 while의 구성방식을 따른다.

다만, 내용을 우선적으로 한 번 수행한 뒤 while과 동일한 동작을 수행.

조건이 맞든 안 맞든 내용부터 실행한다.

do {
    System.out.println(a);
    a++;
}while(a <= 10);

출력 결과 : 100

a가 100인 상황에서 출력 먼저 하고 1 더하고 그 다음 조건 실행하면서 a는 101이므로 종료.

 

 

 

3. for문

제일 중요!

초기값, 조건, 증감값이 한 줄에 다 나온다.

for(int i = 1 ; i <= 10 ; i++) {
    System.out.println(i);
}

출력 결과 : 1부터 10까지.

 

 

 

 

 

다중반복문

반복문 안에 반복문을 선언하여 사용하는 것.

특정 행위 안에서 반복적인 내용이 존재하는 경우 사용한다.

for문을 사용하여 2중 반복문을 만들 경우 다음과 같은 횟수를 가지게 된다.

for(int i = 0; i < 5; i++) {
    for(int j = 0; j < 5; j++) {
        System.out.println(i + "," + j);
    }
}

출력 결과 : 0,0 부터 4,4 까지

 

바깥 반복문은 안 반복문이 뭐든 신경쓰지 않는다
안 반복문의 내용은 바깥 반복문에 영향 받음. 그래서 i도 j도 가져다 쓸 수 있다.
다중반복문의 제일 중요한 점은 안쪽 알맹이가 몇 번 실행되느냐이다.

 

 

 

 

예제)

원하는 결과 출력하기

 

참고 :

System.out.print(); 이어서 출력
System.out.println("");  줄바꿈

//1번
for(int i = 1; i < 6; i++) {
    for(int j = 1; j < 6; j++) {
        System.out.print("*");
    }
    System.out.println("");

}

//2번
for(int i = 1; i < 6; i++) {
    for(int j = 0; j < i; j++) {
        System.out.print("*");
    }
    System.out.println("");

}

//3번
for(int i = 1; i < 6; i++) { //12345
    for(int j = 6; j > i; j--) { //
        System.out.print("*");
    }
    System.out.println("");

}

//4번
for(int i = 1; i < 6; i++) { 
    for(int j = 5; j > i; j--) { 
        System.out.print(" ");
    }
    for(int k = 0; i > k; k++) { 
        System.out.print("*");
    }
    System.out.println("");
}

//5번
for(int i = 1; i < 6; i++) {
    for(int j = 1; j < i; j++) {
        System.out.print(" ");
    }
    for(int k = 6; k > i; k--) { 
        System.out.print("*");
    }
    System.out.println("");
}

//6번
for(int i = 1; i < 6; i++) { 
    for(int j = 5; j > i; j--) { 
        System.out.print(" ");
    }
    for(int k = 0; i > k; k++) { 
        System.out.print("*");
    }
    for(int m = 1; m < i; m++) {
        System.out.print("*");
    }
    System.out.println("");
}

//7번
for(int i = 1; i < 6; i++) {
    for(int j = 1; j < i; j++) {
        System.out.print(" ");
    }
    for(int k = 6; k > i; k--) { 
        System.out.print("*");
    }
    for(int m = 5; m > i; m--) { 
        System.out.print("*");
    }
    System.out.println("");
}

//8번
for(int i = 1; i < 6; i++) {
    for(int j = 5; j > i; j--) { 
        System.out.print(" ");
    }
    for(int k = 0; i > k; k++) { 
        System.out.print("*");
    }
    for(int m = 1; m < i; m++) {
        System.out.print("*");
    }
    System.out.println("");
}
for(int i = 1; i < 6; i++) { 
    for(int m = 0; m < i; m++) {
        System.out.print(" ");
    }
    for(int j = 5; j > i; j--) { 
        System.out.print("*");
    }
    for(int k = 4; k > i; k--) { 
        System.out.print("*");
    }
    System.out.println("");
}

 

 

그리고 블로그 보고 8번을 for문 6개로 줄임..

위에 숫자(n) 입력하는 코드는 그냥 신기해서 같이 가져옴.

출처: https://youngest-programming.tistory.com/24

int n;
Scanner sc = new Scanner(System.in);
while (true) {
    System.out.println("숫자를 입력하시오(홀수,양수)");
    n = sc.nextInt();
    if (n % 2 == 0 || n <= 0) {
        System.out.println("홀수만 입력해주세요(양수입력해주세요)");
    } else {
        break;
    }
}

System.out.println("마름모 모양");
int i, j = 0;
int star = 0;
//위 삼각형
for (i = 0; i < n; i += 2) { 
    for (j = n-2; j >= i; j -= 2) { 
        System.out.print(" ");
    }
    for (star = 0; star <= i ; star++) { 
        System.out.print("*");
    }
    System.out.println();
}
//밑 역삼각형
for (i =0; i <= n - 2; i += 2) {  
    for (j = 0; j <= i; j += 2) {   
        System.out.print(" ");
    }
    for (star = n - 2; star > i; star--) { 
        System.out.print("*");
    }
    System.out.println();
}

 

 

 

 

+강사님 풀이 추가

 

6번 산

1에서 0,2,4,6,8 늘어났으니 1+2*i

//6번. 방법1) 이미지로 접근했을 때
for(int i = 0; i<5; i++) {
    //공백
    for(int j = 0; j<4-i; j++) {
        System.out.print(" ");
    }
    //별
    for(int j = 0; j<1+(2*i); j++) {
        System.out.print("*");
    }
    System.out.println();
}

//6번. 방법2) 
for(int i = 0; i<5; i++) {
    //별
    for(int j = 0; j<9; j++) {
        if(j<4-i) {
            System.out.print(" ");  //공백
        }
        else if(j>4+i) {
            System.out.print(" ");  //공백
        }
        else {
            System.out.print("*");  //별
        }
    }
    System.out.println();
}

//6번. 방법3) 공백 조건을 합칠 수 있음
for(int i = 0; i<5; i++) {
    //별
    for(int j = 0; j<9; j++) {
        if(j<4-i || j>4+i) {
            System.out.print(" ");  //공백
        }
        else {
            System.out.print("*");  //별
        }
    }
    System.out.println();
}

 

7번 하단 역삼각형

//하단 역삼각형 (공백 한 칸 띄고 시작)
for(int i = 1; i<5; i++) {
    //공백
    for(int j = 0; j<i; j++) {
        System.out.print(" ");
    }
    //별
    for(int j = 0; j<9-(2*i); j++) {
        System.out.print("*");
    }
    System.out.println();
}

 

8번 마름모

먼저 공백 조건 잡아보기.

i는 i-4보다 작을 때 공백이다.
1,2,3 사분면 공백 조건 :  j < 4-i || j >4+i || j < i-4

4사분면 같은 경우는 아래와 같이..


조건은 맞닿는 데부터 잡는 게 좋다. 모서리에서 대각선으로 위로 쭉 그려주면 13에 닿음.


0 13
1 12 13
2 11 12 13

...
i가 1씩 증가할 때 j는1씩 감소하고 있으니 13-i보다 크거나 같음.

즉, 마름모를 그릴 때 공백 조건은
j < 4-i || j >4+i || j < i-4 || j >=13-i
짝수일 때는 코드가 좀 길어짐..

//8번
for(int i = 0; i<9; i++) {
	//별
    for(int j = 0; j<9; j++) {
        //공백
        if(j<4-i || j>4+i || j<i-4 || j>=13-i) {
            System.out.print(" ");
        } 
        //별
        else {
            System.out.print("*");
        }
    }
    System.out.println();
}