공부를 하자!/나도코딩 자바 기본편

[나도코딩 자바 기본편] 8일차: 이중 반복문, Break, Continue

kimchopchop 2024. 11. 24. 23:30

나도코딩 자바 기본편_8일차(24.11.24)
 

#023 <이중 반복문>

 
1) 별 (*) 사각형 만들기
 
<원하는 결과>
*****
*****
*****
*****
*****
 

방법1) 수동으로 반복

for (int i = 0; i < 5; i++) {     → 세로 5번 반복
      System.out.print("*");
      System.out.print("*");
      System.out.print("*");
      System.out.print("*");
      System.out.print("*");    → 가로 5번 반복
System.out.println();    → 줄바꿈
}
 

방법2) 자동으로 반복

for (int i = 0; i < 5; i++) {            → 세로 5번 반복
      for (int j = 0; j < 5; j++) {      → 가로 5번 반복
            System.out.print("*");
}
System.out.println(); → 줄바꿈
}
 
 
2) 별(*) 왼쪽 삼각형 만들기
 
<원하는 결과>
*
**
***
****
*****
 
for (int i = 0; i < 5; i++) {               → 세로 5번 반복
      for (int j = 0; j < i+1; j++) {      → j <= i 로 써도 같은 결과(j는 i 이하)
             System.out.print("*");        → 가로 5번 반복(반복 횟수 1~5 되도록)
}
System.out.println();   → 줄바꿈
}
 
 
3) 별(*) 오른쪽 삼각형 만들기
 
<원하는 결과>             
                   * 
                  ** 
                 ***  
                **** 
               ***** 
 
 <일단 이렇게 생각하고 S를 공백으로 바꾸기>
     SSSS*
     SSS**
     SS***
     S****
     *****
 
for (int i = 0; i < 5; i++) {               → 세로 반복 5번 (→ i<5)
       for (int j = 0; j < 4 - i; j++) {    → 가로 반복 4~1 (→ 5-i-1 = 4-i)
                                                      → (i가 1씩 커지니까 가로 반복 1씩 줄어듦)
              System.out.print(" "); → 공백을 S로 생각하면 쉬움(S 4개 -> 1개)
        }
       for (int k = 0; k <= i; k++) { → k<i+1 로 써도 같은 결과(k는 i 이하)
             System.out.print("*");
        }
       System.out.println();
}
 
 
4) 구구단 만들기
 
<형태 정리>
2 x 3 = 6
i x j = i*j
i + "x" + j = "=" + (i*j)
 
for (int i = 2; i < 10; i++) {            → 2단부터 9단까지(i = 1~9)
       for (int j = 1; j < 10; j++) {      → 1부터 9까지 곱하기(j = 1~9)
              System.out.println(i + "x" + j + "=" + (i*j));
        }
System.out.println();   → 단 구분을 위한 줄바꿈
}
 
 

#024 <Break>
*Break

특정 조건이 되었을 때 반복문 탈출
 
-한정판매 치킨집
매일 20마리만 판매하는 치킨집 (1인당 1마리만 구매 가능)
손님 50명 대기 중
 
1) For문
int max = 20;     → 최대 20마리까지만 판매
for (int i = 1; i <= 50 ; i++) {     → i = 손님(1~50번) 수보다 작거나 같을 동안 반복
       System.out.println(i + "번 손님, 주문하신 치킨 나왔습니다.");
       if (i == max) {     → i가 max (20마리) 이면 재료 소진 안내
           System.out.println("금일 재료가 모두 소진되었습니다.");
           break;     → 특정 조건이 되면 break가 속한 반복문 탈출
        }
}
System.out.println("영업을 종료합니다.");
 
 
2) While문
int index = 1;     → 손님 대기 번호
while (index <= 50) {     → index가 50보다 작거나 같을 동안(손님 50명)
        System.out.println(index + "번 손님, 주문하신 치킨 나왔습니다.");
         if (index == max) {     → index가 max (20마리) 이면 재료 소진 안내
             System.out.println("금일 재료가 모두 소진되었습니다.");
             break;     → 특정 조건이 되면 break가 속한 반복문 탈출
          }
          index++;     → while문에서는 index 증감 따로 적어주기
}
System.out.println("영업을 종료합니다.");
 
 

#025 <Continue>
*Continue

특정 조건 만나면 건너뜀
 
-치킨집 예시
노쇼 발생한 경우
 
1) For문
int max = 20;     → 최대 20마리까지만 판매
int sold = 0;     → 현재 판매 수량
int noShow = 17;     → 17번 손님 노쇼
for (int i = 1; i <= 50; i++) {     → i = 손님(1~50번) 수보다 작거나 같을 동안 반복
      System.out.println(i + "번 손님, 주문하신 치킨 나왔습니다.");
 
      // 손님이 없다면? (noShow)
      if (i == noShow) {
          System.out.println(i + "번 손님, 노쇼로 인해 다음 손님에게 기회가 넘어갑니다.");
          continue;      → continue 만나면 아래 코드 수행하지 않고 다음으로 넘어감
                                → 판매 처리 건너뛰고 다음 번호로 넘어감 (21번 손님까지 판매)
       }
 
       sold++;      → 판매 처리(치킨 가져갔으면 현재 판매 수량 +1)
       if (sold == max) {
          System.out.println("금일 재료가 모두 소진되었습니다.");
          break;      → 특정 조건이 되면 break가 속한 반복문 탈출
       }
}
System.out.println("영업을 종료합니다.");
 
 
2) While문
int index = 1;      → 손님 대기 번호
while (index <= 50) {      → index가 50보다 작거나 같을 동안(손님 50명)
           System.out.println(index + "번 손님, 주문하신 치킨 나왔습니다.");
 
           // 손님이 없다면? (noShow)
          if (index == noShow){
              System.out.println(index + "번 손님, 노쇼로 인해 다음 손님에게 기회가 넘어갑니다.");
               index++;      → while문에서는 index 증감 따로 적어주기
                                    → continue 만나면 아래 코드 수행하지 않으니까 여기서도 써주기
               continue;
           }
 
           sold++;      → 판매 처리
           if (sold == max){
               System.out.println("금일 재료가 모두 소진되었습니다.");
               break;      → 특정 조건이 되면 break가 속한 반복문 탈출
           }
           index++;      → while문에서는 index 증감 따로 적어주기
}
System.out.println("영업을 종료합니다.");
 
 

*참고 1) index++ 통합

int index = 1;
while (index < 50) {      → While 조건 50 미만으로 바꾸고
  index++;      → While문 들어오자마자 일단 index +1 증가 처리
                    → 이렇게 하면 index++ 한 번만 쓸 수 있음
System.out.println(index + "번 손님, 주문하신 치킨 나왔습니다.");
 
 

*참고 2) While (true)

int index = 1;
while (true) {      → while (index < 50) 대신 (true)도 가능
                          → break 탈출 조건 있기 때문에 (없으면 무한 루프) 이렇게 써도 됨
System.out.println(index + "번 손님, 주문하신 치킨 나왔습니다.");
 
 

오늘의 한마디

 
 

오늘 이중 반복문 무조건 이해하고 넘어간다는 마음으로 계속계속 붙잡고 있었다. 중간에 아무리 노력해도 이해가 안 되는 부분이 있어서 결국 챗gpt(처음 써봄...)한테 물어봤는데 이해하고 보니 아무것도 아닌 거라서 현타가 왔다...^^ 이건 코딩이 아니라 그냥 기초 수학이잖아... 역시 난 안 되는 걸까, 난 왜 이렇게 이해가 느릴까 기죽어 있었는데 챗gpt한테 위로받았다. 너는 무슨... ai가 사람보다 말을 예쁘게 하니...
 

그래도 끈질기게 물고 늘어진 결과 별 찍기(네모, 왼쪽 세모, 오른쪽 세모)를 혼자 할 수 있게 됐다! 물론... 내일이면 다시 까먹겠지만... 그러면 또 공부하면 되지! 인텔리제이로 실습도 하지만 그래도 역시 손으로 한 번 써야 머리에 들어오는 것 같아서 머리 식힐 겸 다이소 가서 화이트보드 사왔다. 진작 살걸 너무 좋잖아...!!!

오늘은 진짜 하루 종일 코딩 공부만 해서 할 말이 많네... 어려운 부분이 나와서 개빡치지만 머리 아프지만 몇 시간 내내 삽질하다 드디어 이해했을 때의 짜릿함도 더 커졌다. 기본편 강의는 이제 3분의 2 정도 들었다. 다음 주에는 지금까지 배운 거 차근차근 복습하고 다음으로 넘어가야지. 4번 퀴즈 풀면서는 또 얼마나 머리를 쥐어뜯을지 겁나고 설렌당... 오늘 별을 너무 많이 찍어서 꿈에 별이 나올 것 같다.