본문 바로가기
Programming/기타

[JAVA] 반복문 이용하여 별표 직각삼각형 출력하기

by Bam_t 2021. 2. 22.
728x90

사용자로부터 삼각형의 단 수를 입력받아 출력합니다.

직각의 위치는 총 네 가지(왼쪽 아래, 왼쪽 위, 오른쪽 아래, 오른쪽 위)를 출력합니다.

import java.util.Scanner;

public class OnStudy {
    static void triangle1(int column) { //왼쪽 아래가 직각
        for (int i = 0; i < column; i++) {
            for (int j = 0; j < i + 1; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }

    static void triangle2(int column) { //왼쪽 위가 직각
        for (int i = 0; i < column; i++) {
            for (int j = 0; j < column - i; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }

    static void triangle3(int column) { //오른쪽 아래가 직각
        for (int i = 0; i < column; i++) {
            for (int j = 0; j < column - i - 1; j++) {
                System.out.print(" ");
            }
            for (int k = 0; k <= i; k++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }

    static void triangle4(int column) { //오른쪽 위가 직각
        for (int i = 0; i < column; i++) {
            for (int j = 0; j < i; j++) {
                System.out.print(" ");
            }
            for (int k = 0; k < column - i; k++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.print("단 :");
        int column = scanner.nextInt();

        System.out.print("=왼쪽 아래가 직각인 삼각형=\n");
        triangle1(column);
        System.out.println("-------------------------");

        System.out.print("=왼쪽 위가 직각인 삼각형=\n");
        triangle2(column);
        System.out.println("-------------------------");

        System.out.print("=오른쪽 아래가 직각인 삼각형=\n");
        triangle3(column);
        System.out.println("-------------------------");

        System.out.print("=오른쪽 위가 직각인 삼각형=\n");
        triangle4(column);
        System.out.println("-------------------------");
    }
}//EndOfClass

 

1. 왼쪽 아래가 직각인 삼각형

왼쪽 아래가 직각인 삼각형은 간단합니다. n단일때, 첫 번째 줄에 1개, 두 번째 줄에 2개, ... n 번째 줄에 n개의 별을 찍기 때문입니다.

static void triangle1(int column) { //왼쪽 아래가 직각
        for (int i = 0; i < column; i++) {	//행을 세는 카운터 변수 i
            for (int j = 0; j < i + 1; j++) {	//별을 찍을 횟수를 정하는 for문과 카운터 변수 j
                System.out.print("*");
            }
            System.out.println();
        }
    }

 

2중첩 for문을 사용했는데 바깥의 for문은 입력받은 n행 만큼 반복하기 위한 반복문 입니다.

그리고 안쪽의 for문은 현재 행에서 찍을 별의 갯수만큼 반복하는 반복문입니다. 이는 이하의 삼각형들에서도 똑같이 사용됩니다.

 

for (int j = 0; j < i + 1; j++)	//i는 현재 행(column)

안쪽의 for문에서 보면 왼쪽 아래 직각 삼각형은 n행에 n개의 별을 찍기 때문에 현재 행 수만큼 반복해서 *를 찍습니다.

여기서는 제가 행을 1이 아닌 0부터 세었기 때문에 조건식이 j < i가 아니라 j < i + 1이 왔습니다.


2. 왼쪽 위가 직각인 삼각형

왼쪽 위가 직각인 삼각형은 1행에서 n개, 2행에서 n-2개, ... , n행에서 1개[n-(n-1)]개의 별을 찍는 방식입니다.

    static void triangle2(int column) { //왼쪽 위가 직각
        for (int i = 0; i < column; i++) {
            for (int j = 0; j < column - i; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }

현재 행의 별 갯수 = 총 행수 - 현재 행 수 이므로 조건식을 다음과 같이 적을 수 있습니다.

for (int j = 0; j < column - i; j++)

 

마찬가지로 행 수를 0단부터 세기로 했기에 column - i 이고, 만약 행 수를 1단 부터 센다면 column - i -1으로 조건을 두어야 올바른 결과가 도출됩니다.


3. 오른쪽 아래가 직각인 삼각형

직각을 오른쪽에 위치시키는 부분에 있어서는 약간의 생각을 요구합니다.

다른 방법도 있겠지만 저는 풀때 다음과 같이 생각하여 풀이를 했습니다.

 

1. n행의 삼각형이 아닌 n x n의 사각형을 찍자.

2. 공백도 별처럼 문자를 찍어준다라고 생각하자.

 

컴퓨터는 우리가 별을 찍으라고 명령하면 오른쪽부터 찍어야 하는지 왼쪽부터 찍어야 하는지 알 수 없으므로 명령을 내리면 컴퓨터의 기본 실행 방향인 왼쪽부터 찍게됩니다. 그래서 오른쪽에 별을 출력하고 싶다면 따로 추가적인 명령을 내려주어야 합니다. 우선 빈칸을 진짜 빈칸이아닌 '공백문자' 라고 생각 한 후에 한 줄을 처리할때 공백문자를 찍고 별을 원하는만큼 찍는다고 생각할 수 있습니다.

또는 아래 그림에서도 알 수 있듯이 공백문자끼리도 직각삼각형을 이룹니다. 그래서 공백문자로 '1칸이 적은 대각선 대칭방향의' 직각삼각형을 출력하고 별표로 남은 삼각형을 만든다고 생각해도 됩니다.

 

5단 오른쪽 아래 직각삼각형을 예시로 네모는 공백을 찍을 위치 별은 별표 모양을 찍을 위치입니다.

static void triangle3(int column) { //오른쪽 아래가 직각
        for (int i = 0; i < column; i++) {
            for (int j = 0; j < column - i - 1; j++) {
                System.out.print(" ");
            }
            for (int k = 0; k <= i; k++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }

마찬가지로 2중첩 for문을 사용했는데 안쪽에 for문이 두 개가 옵니다.

먼저 오는 for문은 공백을 찍기위한 for문, 나중에 오는 부분은 별을 찍기위한 for문입니다. 이렇게해야 한 줄에서 빈칸을 찍은 다음에 별을 찍어서 삼각형 모양을 만들어 낼 수가 있습니다.

 

다시 삼각형으로 돌아와서 오른쪽 아래가 직각인 삼각형은 1행에는 n-1개의 공백과 1개의 별, 2행에는 n-2개와 2개의 별, ... , n행에는 0개의 공백과 n개의 별이 오게됩니다.

한 행에서 공백은 (n- 현재 행 수)개 오고, 별은 행의 수 만큼 오게되는 것입니다.

for (int j = 0; j < column - i - 1; j++)	//공백을 찍을 for

for (int k = 0; k <= i; k++)	//별을 찍을 for


4. 오른쪽 위가 직각인 삼각형

오른쪽 위가 직각인 삼각형도 마찬가지로 공백을 찍고 별을 찍는다는 접근을 가지고 출발합니다.

static void triangle4(int column) { //오른쪽 위가 직각
        for (int i = 0; i < column; i++) {
            for (int j = 0; j < i; j++) {
                System.out.print(" ");
            }
            for (int k = 0; k < column - i; k++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }

 

오른쪽 위 직각 삼각형은 한 행에서 공백은 (현재 행 수 -1)개, 별은 (n - 현재 행 수 - 1)개 만큼 오는 식이 성립하게 됩니다. 그래서 내부 for문의 조건은 다음과 같이 오게됩니다.

for (int j = 0; j < i; j++)	//공백을 찍는 for

for (int k = 0; k < column - i; k++)	//별을 찍을 for

728x90

댓글