티스토리 뷰

728x90
인수와 출력 타입을 입력 받아 타입별로 별을 찍어 보자
단 입력은 홀수만 입력이 된다.

 

1. TYPE 1

 

숫자 3을 입력 받았을 경우

 

한줄에 별이 입력 받은 수 만큼 출력이 되었고, 전체 줄도 입력 받은 수 만큼 출력이 된 것을 볼 수 있다.

 

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();
}

 

이중 for 문을 이용하여 입력 받은 수 만큼 반복문을 돌려주면 된다.

inner for문이 끝나면 줄 바꿈을 위해서 enter 를 해주어야 한다.

 


 

2. TYPE 2

 

숫자 3을 입력 받았을 때 삼각형 만들기

 

입력받은 수 까지 별이 순차적으로 증가하는 형태를 가지고 있다.

 

public static void type2(int n) {
    System.out.println("== Type2 ==");

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

    System.out.println();
}

 


 

3. TYPE 3

 

type2 와 반대 되는 삼각형 출력을 해야한다.

이때 고려할 사항은 type2 와 다르게 공백의 수를 계산해야한다는 점이다.

 

type2 와 반대 되는 모양 출력 (입력 : 3)

 

public static void type3(int n) {
    System.out.println("== Type3 ==");

    for (int i = 0; i < n; i++) {
        for (int j = n-1; j >= 0; j--) {
            if(i>=j){
                System.out.print("*");
            }
            else if(i<j) {
                System.out.print(" ");
            }
        }
        System.out.println();
    }
    System.out.println();
}

 

첫번째 줄은 공백이 2개이고 3번째에 별이 1개 출력이 되어야 한다.

공백의 위치를 계산하기 위해서 j=n-1 (2) 로 초기화했다. 

공백이 있어야하는 범위를 j 라고 하며, i 로 탐색을 하며 j 범위 전까지는 공백을 찍으며 j 이후에는 별을 찍도록 하였다.

 

 


4. TYPE 4

 

입력 : 3

위의 모양을 분석을 해보면 첫번째 줄은 1개이고 2번째 줄은 3, 3번째 줄은 5개 이다.

n-2, n, n+2 의 규칙을 가지고 있다.

 

가로는 n+2 이며, 세로는 n 인것을 알 수 있다.

 

public static void type4(int n) {
    System.out.println("== Type4 ==");

    int center = (n+2) / 2;
    int leftCenter = center;
    int rightCenter = center;

    while(true){
        if(leftCenter < 0) break;

        for (int i = 0; i < n+2; i++) {
            if(leftCenter <= i && rightCenter>=i){
                System.out.print("*");
            }
            else {
                System.out.print(" ");
            }

        }
        leftCenter--;
        rightCenter++;
        System.out.println();
    }
    System.out.println();
}

 

leftCenter 와 rightCenter 로 별이 찍혀야하는 범위를 지정하였다.

for 문이 반복 될 수록 leftCenter 는 1개씩 감소하여 왼쪽으로 가야하며, rightCenter 는 1개씩 증가하여 오른쪽으로 이동해야한다.

 


5. TYPE 5 

 

입력 : 7

 

public static void type5(int n) {
    System.out.println("== Type5 ==");

    int left = n/2 -1;
    int right = n/2 + 1;

    //상부
    for (int i = 0; i < n/2; i++) {
        for (int j = 0; j < n; j++) {
            if(left < j && right > j) {
                System.out.print("*");
            }

            else if(left > j || right > j){
                System.out.print(" ");
            }
        }
        left--;
        right++;
        System.out.println();
    }

    //중간
    for (int i = 0; i < n; i++) {
        System.out.print("*");
    }
    System.out.println();

    //하부
    left = 0;
    right = n-1;

    for (int i = 0; i < n/2; i++) {
        for (int j = 0; j < n; j++) {
            if(left < j && right > j) {
                System.out.print("*");
            }

            else if(left > j || right > j){
                System.out.print(" ");
            }
        }
        left ++;
        right --;
        System.out.println();
    }

    System.out.println();
}

 

개인적으로 5번이 제일 까다로운 문제라고 생각한다.

이것을 한번에 출력 한다고 생각하기보다는 3단계로 나누어서 출력한다고 생각하면 조금 더 쉽게 접근 할 수 있다.

 

 

상부의 공백을 보면 첫째줄에는 000X000 center 기준으로 3개이며 둘째줄은 00XXX00 이며 center 기준으로 2개씩이고 상부의 마지막은 0XXXXX0 1개씩인 것을 알 수 있다.

이것을 범위로 나타내보면 첫째줄은 0~2 까지 공백이며 3번째 별이 찍히고 4~6 까지 공백이 찍힌다.

2째줄은 0~1까지 공백이며 2~4 까지 별이 찍히고 5~6 까지 공백이 찍힌다.

상부의 마지막 줄인 3째줄은 0 까지 공백이며 1~5 까지 별이 찍히며 6에 공백이 찍힌다.

 

이것을 2중 포문으로 생성했으며 왼쪽에 찍힐 최대 공백의 인덱스를 left 라고 하며 오른쪽에 처음으로 공백이 찍힐 인덱스를 right 라고 하였다.

inner for 문에서 left 와 right 의 범위를 비교하여 별을 찍도록 하였고 별이 출력될 구간이 아니면 공백을 출력 하도록 하였다.

inner for 문이 종료 되고 밖에 있는 for 문으로 나왔을 때 별이 찍힐 구간을 재 설정 해줘야 하므로 left 와 right 의 값을 변경하도록 하였다.

 

중간은 입력 받은 수만큼 출력 하면 된다.

 

하부는 상부와 동일하게 출력 했으며 단 left 와 right의 인덱스를 다르게 시작하였다.

상부는 별이 출력 될 구간이 점점 늘어났다면 하부는 별이 출력 될 구간이 좁아졌다.

이것을 고려하여 left, right 값을 설정해주었다.

 

 


 

다양한 형태의 별을 출력을 해보면서 type 5가 해결하는데 오래걸렸다.

별을 3단계로 나누어서 출력을 한다는 점이 key point 인 것 같다.

3단계로 나누어서 출력하고 출력을 할 부분을 범위로 지정해서 코드를 작성하니 문제가 해결되었다.

 

 

 

728x90