상세 컨텐츠

본문 제목

[Java] 연습문제4 - 여러가지 별 찍기

Java/제로베이스

by Gopythor 2023. 1. 8. 02:52

본문

728x90
반응형

Practice4

문제 설명

여러가지 별찍기 연습을 해보자.
반복문과 조건문의 연습에는 과연 별찍기 만한 것이 없다.

아래 5가지 별 찍기 타입이 있다.

  • 아래 모양은 N (별 출력 행의 수)이 3일 떄의 출력 결과 들이다.

 

타입 모양
1 ***
***
***
2 *
**
***
3   *
 **
***
4   *
 ***
*****
5   *
 ***
  *

별 출력 행의 수 N과 별 타입 T가 주어질 때 해당 별 모양을 출력하는 프로그램을 작성하세요.
(N은 홀수)

입출력 예시

 

N T 출력
3 1 ***
***
***
3 2 *
**
***
3 3   *
 **
***
3 4   *
 ***
*****
7 5    *
  ***
 *****
*******
 *****
  ***
   *

 

Solution 부분 구현

모범코드

public static void solution(int n, int type) {
    if (type == 1) {
        type1(n);
    } else if (type == 2) {
        type2(n);
    } else if (type == 3){
        type3(n);
    } else if (type == 4) {
        type4(n);            
    } else if (type == 5) {
        type5(n);
    }
}

내코드

public static void solution(int n, int type) {
    switch (type){
        case 1:
            type1(n);
            break;
        case 2:
            type2(n);
            break;
        case 3 :
            type3(n);
            break;
        case 4:
            type4(n);
            break;
        case 5:
            type5(n);
            break;
    }
}
  • 간단하게 switch - case 조건문으로 작성하였다.

타입1

public static void type1(int n) {
    System.out.println("== Type1 ==");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            System.out.print("*");
        }
        System.out.println();
    }
    System.out.println();
}

 

타입2

public static void type2(int n) {
    System.out.println("== Type2 ==");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < i+1; j++) {
            System.out.print("*");
        }
        System.out.println();
    }
    System.out.println();
}

 

타입3

public static void type3(int n) {
    System.out.println("== Type3 ==");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (j < n-i-1) {
                System.out.print(" ");
            } else {
                System.out.print("*");
            }   
        }
        System.out.println();
    }
    System.out.println();
}
  • 기본 구조는 타입1과 같지만, if문을 추가하여 공백과 * 출력을 구분했다.
  • 행수가 늘어남에 따라 공백의 갯수가 줄으므로 n-i-1이 들어간다.

내 코드

public static void type3(int n) {
    System.out.println("== Type3 ==");
    for (int i = 0; i < n; i++) {
        for (int k = 0; k <n-1-i; k++) {
            System.out.print(" ");
        }
        for (int j = 0; j < i+1; j++) {
            System.out.print("*");
        }
        System.out.println();
    }
    System.out.println();
}
  • 별표 부분을 먼저 구현하고나서, 공백부분을 구현하였다.
  • k부분의 for문이 돌아서 공백을 찍고, j의 for문은 별표를 찍었다.
  • 사실상 기본 구조는 타입 2와 같다.

타입4

public static void type4(int n) {
    System.out.println("== Type4 ==");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            System.out.print(" ");
        }
        for (int j = 0; j < i * 2 + 1; j++) {
            System.out.print("*");
        }
        System.out.println();
    }
    System.out.println();
}
  • 공백을 구현하는 부분은 출력 행수 - i - 1로 구현하였다.
  • 홀수는 i * 2 +1로 구현한다. 그래야 1번째부터 1이 나오고 +2씩 증가한다.

내코드

public static void type4(int n) {
    System.out.println("== Type4 ==");
    for (int i = 0; i < n; i++) {
        for (int k = n-i-1; k > 0; k--) {
            System.out.print(" ");
        }
        for (int j = 0; j < (i*2)+1; j++) {
            System.out.print("*");
        }
        System.out.println();
    }
    System.out.println();
}

 

  • 직관적으로 공백을 계산하기 위해  for문이 감소로 작성되었다.

타입5

public static void type5(int n) {
    System.out.println("== Type5 ==");
    // 상단부
    for (int i = 0; i <= n/2; i++) {
        for (int j = 0; j < n / 2 - i; j++) {
            System.out.print(" ");
        }
        for (int j = 0; j < i*2 + 1; j++){
            System.out.print("*");
        }
        System.out.println();
    }
    // 하단부
    for (int i = n / 2; i > 0 ; i--) {
        for (int j = 0; j < n / 2 + 1 - i; j++){
            System.out.print(" ");
        }
        for (int j = 0; j < i * 2 - 1; j++) {
            System.out.print("*");
        }
        System.out.println();
    }
    System.out.println();
}
  • 코드는 상단부와 하단부로 나뉘며, 중간까지는 타입4와 비슷하게 작동한다.
  • 첫번째 상단부 for 문에서 표시할 행값보다 1회 더 돌아야 하기 때문에 작거나 같다로 조건문이 붙었다.
  • 공백을 출력하는 for문은 i가 증가함에 따라 공백도 감소한다.
  • 별표를 찍는 for문은 홀수 단위로 증가한다.
  • 하단부에서는 메인 for문을 감소로 작성하였다.
  • 공백for문은 i가 감소하기 때문에, 그만큼 공백을 찍는 횟수가 늘어난다.
  • 반대로 별표를 찍는 for문은 i가 줄음에 따라 별표의 수도 줄어든다.

내코드

public static void type5(int n) {
    System.out.println("== Type5 ==");
    for (int i = 0; i < n; i++) {
        if (i<n/2+1){
            for (int k = n/2-i; k > 0; k--) {
                System.out.print(" ");
            }
            for (int j = 0; j < (i*2)+1; j++) {
                System.out.print("*");
            }
            System.out.println();
        } else {
            for (int k =i-n/2;  k>0; k--) {
                System.out.print(" ");
            }
            for (int j = 0; j <(n-i)*2-1; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
    System.out.println();
}
  • for문은 0부터 출력을 원하는 행의 숫자까지 증가한다.
  • 모범 코드와 다른 점은, if문으로 상단부, 하단부 코드가 다르게 돌아가게 구현하였다.
  • 공백 for문은 감소하는 형태로 작성되었다.
  • 별표 for문은 일반적은 홀수 증가형태로 작성되었다.
  • else 부분은 i가 증가함에 따라 중간 값에서 차이나는 만큼 공백이 찍힌다.
  • 위의 코드와는 달리 i는 계속 증가하기 때문에 n과 i의 차이 만큼(점차 격차가 줄어들음) 별표가 찍히게 된다.
728x90
반응형

관련글 더보기

댓글 영역