코딩

Day 05 - 자바 이중 for 문 별 그리기 정리

Ledlaputa 2019. 12. 20. 10:55
지난 시간에 배운 이중 for문을 이용한 별 그리기 예제의 정리이다. 기본형에 대한 정리이니 연습해 보고 다른 응용 별 그리기를 해보자 
이중 for문을 이용한 별그리기 연습은 이중 for문을 이해하는데 매우 도움이 된다. 아래는 별그리기에는 기본적인 방법을 중심으로 제시하였다. 
아래 기본형을 응용하면 좀더 복잡한 별그리기가 가능할 것이다. 2중 for문이 아니라 3중 for문 형태로 말이다. 

그럼 차근 차근 for문을 이용한 별그리기를 살펴 보도록 하자 

 

 

1.직삼각형 - 기본 (2중 Loop)

가장 기본이 되는 별그리기이다. 이중for문을 사용하여야 한다.
위에서부터 별의 숫자를 늘려가는 방법이다. 
i가 증가하면서 별을 실제로 찍는 j의 최대 찍는 수를 i를 통해 늘려가는 구조이다.
즉 처음에는 i가 1이므로 j의 최대는 1이지만 i가 5가 되면 j는 최대치가 5가 되어 5개의 별을 찍게 되는것이다. 
i의 수를 늘리는 만큼 삼각형이 커지게 된다. 
        for (int i = 1; i <= 5; i++) { 
            for (int j = 1; j <= i; j++) {
                System.out.print("*");
           }
            System.out.println();
       }   
결과
 

2.직삼각형 - 확장 (3중 Loop)

위의 기본 삼각형이 왼쪽에 붙어서 오른쪽에 경사를 진 삼각형이였다면, 이번 삼각형은 오른쪽에 직각이 되고 왼편이 경사가 있는 삼각형이다. 
모양은 간단해 보이나 이번에는 3중  반복 for문을 사용해야 한다. 
그리고 한번더 고민을 해야할 부분이 있으니 보이기에는 오른쪽에 정렬된듯 하지만 실제 코드에서는 빈 여백을 출력하여 그렇게 보이도록 한것이다. 
i변수가 가장 밖에서 전체를 감싸고 최대치를 조정한다. 그 안에 두개의 for문이 각자 돌아가게 되어있다. 
j변수는 첫 별을 그렸던과 마찬가지의 역할을 한다. 단 이번에는 별 대신 " " 공백을 그려줘야 한다. 
그리고 또다른 k 변수가 실제 별을 그려주게 된다. 
실제로는 첫줄에 별이 오른쪽에 위치한 것이 아니라 그 앞에 " " 진 여백이 4칸 자리 하고 있는 것이다. 
        for (int i = 1; i <= 5; i++) {
            for (int j = 1; j <= 5-i; j++) {
                System.out.print(" ");
           }
            for (int k = 1; k <= i; k++) {
                      System.out.print("*");
                }
            System.out.println();
       }
결과
 

3.역직삼각형 - 기본 (2중 Loop)

역삼각형은 1.직삼각형과 동일한 구조이다. 단 i변수가 1에서 5로 증가했다면 이번에는 반대로 5에서 1로 감소하게 해야한다. 당연히 i++이 아닌 i--를 이용하는 것이다. 
또한 시작이 int i=1에서 int i =5로 시작해야한다. 
for 문에서 증가 형태인 i++과 반대 감소 형태인 i--를 자유롭게 사용하는 것은 중요하다. 
           for (int i = 5; i >= 1; i--) {
            for (int k = 1; k<= i; k++) {
                      System.out.print("*");
                }
            System.out.println();
       }
결과
 

4.역직삼각형 - 확장 (3중 Loop)

마찬가지로 역삼각형을 오른편이 직각인 삼각형을 만드는 연습이다. 

방법은 위에 언급한것과 동일하다. 단지 증가가 아닌 감소를 이용해서 처음에는 별을 그리는 k 변수의 값이 많다가 감소하고 반대로 빈칸을 그리는 j 변수의 값이 적다가 많아지게 하면 된다. 

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

5.정삼각형 - 피라미드 

이제 조금더 머리를 써야하는 for문이다. 기본은 2.직각삼각형과 유사한 3중 for문이나 기존의 직각삼각형에서 정삼각형이 되어야 한다. 일명 피라미드라고도 하며 for문 공부에 자주 등장하는 예제이기도 하다. 
기본 구조는 말한바와 같이 2.직각삼각형과 유사해 보인다. 그런데 차이가 있는것을 살펴보니 별을 그리는 부분에서 그 차이가 나타난다. 
별이 1>3>5>7>9 식으로 증가하고 있다. 단순이 1씩 증가하는것이 아니라는 것이다. 
쉽게 변수 i에 *2를 한다면 2>4>6>8>10으로 증가할것이다. 여기에 우리가 원하는 홀수를 만들기 위해 -1을 해준것이다. 
프로그래밍을 할 때 처음 겪는 두려움(특히 나와같은 이과를 전공하지 않은 사람들)은 수학을 하지 못하는데 과연 프로그래밍을 할수 있을까이다. 
물론 수학을 잘하는것은 분명 도움이 된다. 하지만 그보다 논리적인 사고가 더욱 중요한것 같다. 
아래의 예제에서 수학이라고 할 정도의 것이 등장하지는 않는다. 하지만 논리적으로 고민하고 생각해 봐야 하는 부분이 있는 것은 확실해 보인다. 
그러니 수학책을 수십년동안 던저버린 아재라도 한번 도전해볼 수 있다는 것이다. 
        for (int i = 1; i <= 5; i++) {
            for (int j = 1; j <= 5-i; j++) {
                System.out.print(" ");
           }
            for (int k = 1; k <= i*2-1; k++) {
                      System.out.print("*");
                }
            System.out.println();
       }
결과
 

6.역정삼각형 - 역 피라미드 

이제 피라미드를 반대로 뒤집어 보자. 방법은 동일하다. 위에서 배운 4.역직삼각형에 i*2-1 를 해주면 해결된다. 
        for (int i = 5; i >= 1; i--) {
            for (int j = 0; j < 5-i; j++) {
                System.out.print(" ");
           }
            for (int k = 1; k<= i*2-1; k++) {
                      System.out.print("*");
                }
            System.out.println();
       }
결과
 

7.모래시계 - 응용 형태 1

이제 복잡한 형태를 만들기로 해보자. 

 

첫번쨰는 모래시계 모양을 만들어 보는것이다. 얼핏 코드만 보아도 무언가 복잡함이 느껴질수 있을 것이다. 
방법은 우선 역정삼각형을 그리고 그다음 정삼각형을 그리면 된다. 
결국 우리가 배운 위의 두가지를 연결해 붙이면 되는 것이다. 코드가 긴것 뿐이지 새로운 것은 아닌 것이다. 
실제로 상담 부분 모든 코드와 방법을 기억하는 것은 불가능한것 같다. 특히 우리와 같은 초보들에게는 말이다. 그래서 이러한 방법들을 잘 기록하거나 찾아가면서 코딩을 하는 것이 중요하다. 
내가 모든 방법론을 기억하기 보다는 구글링을 통해 빠르게 잘 찾아 쓰는것이 중요하다는 것이다. 
        for (int i = 5; i >= 1; i--) {
            for (int j = 0; j < 5-i; j++) {
                System.out.print(" ");
           }
            for (int k = 1; k<= i*2-1; k++) {
                      System.out.print("*");
                }
            System.out.println();
       }
        // 정삼각형
        for (int i = 1; i <= 5; i++) {
            for (int j = 1; j <= 5-i; j++) {
                System.out.print(" ");
           }
            for (int k = 1; k <= i*2-1; k++) {
                      System.out.print("*");
                }
            System.out.println();
       }
결과

 

8. 다이아몬드- 응용형태 2

마지막 예제는 다이아몬드 형태이다. 

마찬가지로 두가지 형태를 붙이면 된다. 단지 순서만 정삼각형이 먼저 그뒤에 역삼각형을 그려주면 된다. 

        for (int i = 1; i <= 5; i++) {
            for (int j = 1; j <= 5-i; j++) {
                System.out.print(" ");
           }
            for (int k = 1; k <= i*2-1; k++) {
                      System.out.print("*");
                }
            System.out.println();
       }
        
        for (int i = 5; i >= 1; i--) {
            for (int j = 0; j < 5-i; j++) {
                System.out.print(" ");
           }
            for (int k = 1; k<= i*2-1; k++) {
                      System.out.print("*");
                }
            System.out.println();
       }
결과

이렇게 8가지 형태의 삼각형을 그리는 for문 예제를 연습해 보았다. 
한개의 for 문을 이용하는것도 어려운데 2중 3중 for문이 부담스러울수도 있으나 다음 단계로 넘어가기 전에 충분히 연습하고 손에 익히도록 하자. 
for문이나 if문은 그 사용빈도가 매우 높고 이것들만 잘써도 상당한 프로그래밍을 할수 있으니 말이다. 
프로그래밍은 결국 단순하고 지겨운 반복 업무를 자동으로 반복처리하기 위해서 시작된것이 아니던가. 
 
그럼 다음 시간에 또 다른 형태의 반복문과 조건문을 살펴보도록 하겠다. 
그리고 과정 중에는 중간 중간 이전의 배운 내용을 정리해서 올리도록 할테니 너무 걱정하지 말고 따라와 주길 바란다. 
사실 이글을 건방지게 쓰고 있는 나도 계속 반복하고 되뇌이고 하면서 배우는 중이니 말이다.