[Java 실습] 별 찍기("*")

예세림·2024년 7월 26일

Java

목록 보기
11/12

Java 반복문 예제로 쉽게 접할 수 있는 별 찍기 예제에 대해 살펴보겠습니다.

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

2.

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

추가 설명

1과 2의 콘솔창을 비교해보면, print와 println의 차이를 알 수 있습니다.

  • print: 여러 값을 연속적으로 출력하고 싶을 때 사용합니다. 개행이 없기 때문에 한 줄에 모든 출력이 나타납니다.
  • println: 출력할 때마다 자동으로 개행이 되므로, 각 출력이 새로운 줄에 나타납니다.
  • printf: 형식 지정자를 사용하여 복잡한 형식의 문자열을 출력할 수 있습니다. 예를 들어, 정수, 부동 소수점 숫자, 문자열 등을 형식화하여 출력할 수 있습니다.
  • format: printf와 동일한 기능을 제공하며, 가독성을 위해 사용됩니다.
    cf.) System.out.printf("Name: %s, Age: %d, Price: %.2f%n", name, age, price);

형식 지정자

  • %d: 정수(decimal)
  • %f: 부동 소수점 숫자(float)
  • %s: 문자열(string)
  • %n: 플랫폼에 독립적인 개행 문자

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

다른 방법도 있습니다.

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

개인적으로는 전자가 나은 것 같습니다.
굳이?


여기서부터는 i, j 모두 데려와야 합니다.

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

저는 int i = 0인 게 편해서 이렇게 했는데, int i = 1이라면 이 방법도 있습니다.

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

별 다섯 개에서 한 개가 되는 걸 구현하기 위해
감소하는 i와 증가하는 j를 이용한 반복문을 활용했습니다.

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

추가 설명

  • i = 5: 내부 루프가 0부터 4까지 실행되고, 5개의 * 출력
  • i = 4: 내부 루프가 0부터 3까지 실행되고, 4개의 * 출력
  • i = 3: 내부 루프가 0부터 2까지 실행되고, 3개의 * 출력
  • i = 2: 내부 루프가 0부터 1까지 실행되고, 2개의 * 출력
  • i = 1: 내부 루프가 0만 실행되고, 1개의 * 출력

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

j를 활용한 for문을 두 차례 작성하여 공백과 "*"을 구현했습니다.

j를 두 번 활용하지 않는 방법은 없을까 고민하다가

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

추가 설명

  • i, j의 값을 나타낸 테이블

  • i, j, k의 값을 나타낸 테이블


모양을 보니 6번의 코드에서 " "와 ""을 바꾸고, ""이 다섯 개여야 하니 i <= 5로 바꾸면 될 것 같습니다.

  • i, j 이용
for (int i = 0; i <= 5; i++) {
            for(int j = 0; j < i; j++){
                System.out.print("*");
            }
            for(int j = 5; j > i; j--){
                System.out.print(" ");
            }
            System.out.println();
        }
  • i, j, k 이용
for (int i = 0; i <= 5; i++) {
            for(int j = 0; j < i; j++){
                System.out.print("*");
            }
            for(int k = 5; k > i; k--){
                System.out.print(" ");
            }
            System.out.println();
        }

보자마자 7번에 6번을 복붙해서 사용해야지 했습니다.

6번 답에 공백이 증가하는 부분을 제외하고, for문을 그대로 살린 다음,
"*"이 다섯 번 출력되는 줄이 반복되지 않도록
int j = 4로 설정했습니다.


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

        for (int i = 0; i < 5; i++) {

            for(int j = 4; j > i; j--){
                System.out.print("*");
            }
            System.out.println();
        }

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

"*"이 하나만 출력되는 줄에 유의하여 반복문의 초기값을 설정해야 합니다.

추가 설명

첫 번째 루프

두 번째 루프

다른 방법

  1. 단일 이중 루프
for (int i = 0; i < 9; i++) {
            int stars = (i < 5) ? (5 - i) : (i - 3);
            for (int j = 0; j < stars; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
  1. 배열 이용
int[] starCounts = {5, 4, 3, 2, 1, 2, 3, 4, 5};
        for (int count : starCounts) {
            for (int j = 0; j < count; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

개인적으로는 처음에 소개드렸던 개별 루프를 두 번 사용하는 방식이 제일 직관적인 것 같습니다.

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

        //6번
        for (int i = 0; i <= 5; i++) {
            for(int j = 0; j < i; j++){
                System.out.print(" ");
            }
            for(int j = 5; j > i; j--){
                System.out.print("*");
            }
            System.out.println();

그래도 명색이 마지막 문제라 그런지 은근 까다로웠다.

첫 번째 루프에서 별 네개 까지만 출력하고,
두 번째 루프는 6번을 참조하여 작성했다.

추가 설명

i, j 값 변화 테이블

  • 첫 번째 루프

    공백은 표현이 안 되었는데, " "가 4개, 3개, 2개, 1개가 되었다.

  • 두 번째 루프

좌측 공백이 0개였다가, 1,2,3,4개가 되었다.
생각해보니 루프가 i = 5까지 돌아가는 게 의미가 없어서 두 번째 루프에서 'i <= 5' 를 'i < 5'로 수정해도 무관하다.

다른 방법

단일 이중 루프 사용

public class Main {
    public static void main(String[] args) {
        int rows = 4;
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < rows - i; j++) {
                System.out.print(" ");
            }
            for (int j = 0; j <= i; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
        rows = 5;
        for (int i = 1; i <= rows; i++) {
            for (int j = 0; j < i; j++) {
                System.out.print(" ");
            }
            for (int j = rows; j >= i; j--) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

굳이..


반복문을 통해 "*"을 원하는 모양으로 콘솔창에 출력하는 연습을 해보았다.
다양한 문제를 푸는 데에 도움이 될 수 있을 것 같다. 하지만 너무 재미없다...

0개의 댓글