본문 바로가기
자격증·공부 아카이브/Java 기초

Java 별찍기 완전정리: 이중 for문으로 삼각형·역삼각형·피라미드 출력

by 쑥쑥자라나라 2026. 7. 30.
728x90

Java 별찍기는 바깥쪽 for문으로 행을 만들고, 안쪽 for문으로 각 행의 공백과 별 개수를 결정하는 문제다. 모양을 통째로 외우기보다 현재 행 번호 i에서 무엇을 몇 번 출력할지 계산하면 삼각형, 역삼각형, 피라미드를 같은 원리로 풀 수 있다.

for문의 실행 순서부터 복습해야 한다면 Java 조건문·반복문·배열 코딩테스트 입문을 먼저 읽고 이어가면 흐름이 자연스럽다.

핵심: 바깥 반복문 = 세로 행, 안쪽 반복문 = 한 행의 가로 출력, println() = 다음 행으로 이동.

행 번호가 증가할 때 공백과 별 개수가 달라지는 네 가지 별찍기 패턴

1. 중첩 for문은 행과 열을 나눠 생각한다

행 개수가 rows = 5라면 바깥 반복문의 i0, 1, 2, 3, 4 순서로 움직인다. 화면에서는 첫째 줄부터 다섯째 줄이지만, 코드에서는 0부터 시작한다. 그래서 첫 행의 별 하나는 i + 1로 표현한다.

for (int i = 0; i < rows; i++) {
    // 현재 i번째 행에 필요한 공백과 별 출력
    System.out.println(); // 한 행이 끝난 뒤 줄바꿈
}

예를 들어 오른쪽 정렬 삼각형의 세 번째 행은 i = 2다. 전체 폭이 5칸이므로 공백은 5 - 2 - 1 = 2개, 별은 2 + 1 = 3개다. 코드 실행 순서도 공백 2개 → 별 3개 → 줄바꿈이 된다.

모양공백 개수별 개수행이 내려갈수록
왼쪽 삼각형0i + 1별 1개 증가
왼쪽 역삼각형0rows - i별 1개 감소
오른쪽 삼각형rows - i - 1i + 1공백 감소, 별 증가
중앙 피라미드rows - i - 12 * i + 1공백 감소, 별 2개 증가

2. 왼쪽 삼각형과 역삼각형

왼쪽 삼각형: 별 개수는 i + 1

첫 행은 1개, 둘째 행은 2개처럼 별이 한 개씩 늘어난다. 공백을 따로 출력할 필요가 없어 별찍기 원리를 익히기 가장 좋은 형태다.

*
**
***
****
*****
static void printLeftTriangle(int rows) {
    for (int i = 0; i < rows; i++) {
        for (int star = 0; star < i + 1; star++) {
            System.out.print("*");
        }
        System.out.println();
    }
}

왼쪽 역삼각형: 별 개수는 rows - i

전체 행 수에서 현재 행 번호를 빼면 별이 5, 4, 3, 2, 1개로 줄어든다. rows - i가 0이 되기 전에 바깥 반복문이 끝나므로 마지막 행에도 별 하나가 출력된다.

*****
****
***
**
*
static void printReverseTriangle(int rows) {
    for (int i = 0; i < rows; i++) {
        for (int star = 0; star < rows - i; star++) {
            System.out.print("*");
        }
        System.out.println();
    }
}
728x90

3. 오른쪽 정렬 삼각형: 공백을 먼저 출력한다

오른쪽 정렬에는 한 행 안에서 두 번의 작업이 필요하다. 먼저 rows - i - 1개의 공백으로 시작 위치를 오른쪽으로 밀고, 이어서 i + 1개의 별을 출력한다.

    *
   **
  ***
 ****
*****

i = 2일 때: 공백 5 - 2 - 1 = 2개, 별 2 + 1 = 3개 → ··***

static void printRightTriangle(int rows) {
    for (int i = 0; i < rows; i++) {
        for (int space = 0; space < rows - i - 1; space++) {
            System.out.print(" ");
        }
        for (int star = 0; star < i + 1; star++) {
            System.out.print("*");
        }
        System.out.println();
    }
}

공백 반복문과 별 반복문의 순서를 바꾸면 모양이 달라진다. 오른쪽 정렬에서는 반드시 공백을 먼저, 별을 나중에 출력해야 한다.

4. 중앙 피라미드: 별이 2개씩 늘어난다

피라미드는 오른쪽 정렬 삼각형과 공백 공식이 같다. 차이는 별 개수다. 가운데 꼭짓점에서 시작해 좌우로 한 칸씩 넓어지므로 별이 1, 3, 5, 7, 9개가 된다. 이를 식으로 쓰면 2 * i + 1이다.

    *
   ***
  *****
 *******
*********
static void printPyramid(int rows) {
    for (int i = 0; i < rows; i++) {
        for (int space = 0; space < rows - i - 1; space++) {
            System.out.print(" ");
        }
        for (int star = 0; star < 2 * i + 1; star++) {
            System.out.print("*");
        }
        System.out.println();
    }
}

5. 배열 값만큼 별 막대 출력하기

삼각형은 행 번호로 별 개수를 계산하지만, 막대 그래프는 배열의 현재 값이 별 개수가 된다. 바깥 반복문은 배열 원소를 고르고, 안쪽 반복문은 그 값만큼 별을 출력한다.

static void printBars(int[] counts) {
    for (int i = 0; i < counts.length; i++) {
        System.out.print(counts[i] + " : ");
        for (int star = 0; star < counts[i]; star++) {
            System.out.print("*");
        }
        System.out.println();
    }
}
3 : ***
1 : *
5 : *****

음수 입력은 별을 출력할 수 없으므로 배열을 만들 때 0 이상인지 검증한다. 이 예제는 원문 35의 사용자 입력형 별 그래프를 중첩 반복문의 같은 원리로 연결한 것이다.

6. 네 가지 패턴과 별 막대를 실행하는 Java 코드

입력값 검증까지 포함한 실행 가능한 예제다. 메서드로 분리하면 각 패턴의 반복 조건을 비교하기 쉽고, 필요한 모양만 다시 호출할 수도 있다.

import java.util.Scanner;

public class StarPatterns {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.print("행 개수: ");
        int rows = sc.nextInt();

        if (rows <= 0) {
            System.out.println("행 개수는 1 이상이어야 합니다.");
            sc.close();
            return;
        }

        System.out.println("[왼쪽 삼각형]");
        printLeftTriangle(rows);

        System.out.println("\n[왼쪽 역삼각형]");
        printReverseTriangle(rows);

        System.out.println("\n[오른쪽 삼각형]");
        printRightTriangle(rows);

        System.out.println("\n[중앙 피라미드]");
        printPyramid(rows);

        System.out.println("\n[배열 값만큼 별 막대]");
        printBars(new int[] {3, 1, 5});

        sc.close();
    }

    static void printLeftTriangle(int rows) {
        for (int i = 0; i < rows; i++) {
            for (int star = 0; star < i + 1; star++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }

    static void printReverseTriangle(int rows) {
        for (int i = 0; i < rows; i++) {
            for (int star = 0; star < rows - i; star++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }

    static void printRightTriangle(int rows) {
        for (int i = 0; i < rows; i++) {
            for (int space = 0; space < rows - i - 1; space++) {
                System.out.print(" ");
            }
            for (int star = 0; star < i + 1; star++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }

    static void printPyramid(int rows) {
        for (int i = 0; i < rows; i++) {
            for (int space = 0; space < rows - i - 1; space++) {
                System.out.print(" ");
            }
            for (int star = 0; star < 2 * i + 1; star++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }

    static void printBars(int[] counts) {
        for (int i = 0; i < counts.length; i++) {
            System.out.print(counts[i] + " : ");
            for (int star = 0; star < counts[i]; star++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

7. 별찍기에서 자주 틀리는 부분

println()을 안쪽 반복문에 넣는 경우

별 하나를 출력할 때마다 줄이 바뀐다. 한 행의 공백과 별을 모두 출력한 뒤, 바깥 반복문 끝에서 한 번만 println()을 호출해야 한다.

<와 <=를 혼동하는 경우

star < i + 1star <= i는 같은 횟수만큼 반복한다. 두 표현을 섞어 고치다 보면 별이 한 개 더 나오거나 덜 나오는 오프바이원 오류가 생기기 쉽다. 한 글 안에서는 개수를 기준으로 < 형태를 통일하는 편이 읽기 쉽다.

공백 대신 빈 문자열을 출력하는 경우

System.out.print("")는 아무것도 출력하지 않는다. 정렬에 필요한 것은 실제 한 칸인 System.out.print(" ")다. 결과를 확인할 때는 공백을 점으로 바꿔 출력하면 개수를 눈으로 세기 쉽다.

공백 수를 rows - i로 계산하는 경우

오른쪽 삼각형 첫 행의 별 앞에는 4칸만 필요하다. rows - i를 쓰면 5칸이 되어 전체가 한 칸 오른쪽으로 밀린다. 0부터 시작하는 행 번호 때문에 마지막에 - 1이 필요하다.

핵심 요약

  • 바깥 for문은 행, 안쪽 for문은 한 행의 공백과 별을 담당한다.
  • 증가 삼각형은 i + 1, 역삼각형은 rows - i개의 별을 출력한다.
  • 오른쪽 정렬은 공백 rows - i - 1개를 먼저 출력한다.
  • 중앙 피라미드는 별 개수가 2 * i + 1로 늘어난다.
  • 배열 막대 그래프는 현재 원소 값이 안쪽 반복문의 횟수가 된다.
  • 각 행의 출력이 모두 끝난 뒤 println()을 한 번 호출한다.
728x90