쥬로그

JAVA 별 찍기 본문

Study/JAVA

JAVA 별 찍기

쥬쥬씨 2021. 10. 22. 19:09
반응형

< ⭐ JAVA 별 찍기 >

사용자에게 입력받아, 그 수만큼 줄을 출력해 다양한 모양을 만들 수 있다.


< 공통 code >

Scanner() 클래스를 사용하기 위해 public class 밖에서

import java.util.Scanner;를 선언한다.

main 메소드 안에서

Scanner 변수 이름 = new Scanner(System.in);변수이름.close(); 를 선언한다.

사용자에게 줄 수를 입력받기 위해 아래 코드를 선언한다.

System.out.println("숫자를 입력해주세요.");

System.out.print("> ");

int 변수 이름 = scanner 변수이름.nextInt();

 


 

① 위에서부터 아래쪽으로 커지는 직각삼각형 만들기

첫 번째 줄에서 별이 1개

두 번째 줄에서 별이 2개

세 번째 줄에서 별이 3개

...

10번째 줄에서 별이 10개

즉, n 번째 줄이면 n개만큼 별이 출력된다.

 

1) i for문과 j for문 예시

// i = 줄 개수
for(int i = 1; i <= number; i++) {
    // j = 별 개수
    for(int j = 1; j <= i; j++) {
        System.out.print("*");
    }
    System.out.println("");
}

j for문이 반복되는 횟수만큼 별이 출력된다.

  1. i = 1

   → i <= number → true → j for문 → j = 1 → j <= i → true → "*" 출력 → j ++

→ j = 2 → j <= i → false → j for문 종료 → i ++

  2. i = 2

  → i <= number → true → j for문 → j = 1 → j <= i → true → "*" 출력 → j++

→ j = 2 → j <= i → true → "*" 출력 → j ++ →  j = 3 → j <= i → false → j for문 종료 → i ++

 3. i = 3

....................

  위와 같은 단계 반복


2) String 사용 예시

for(int i = 1; i <= number; i++) {
    String stars ="";
    
    for(int j = 1; j <= i; j++) {
        stars += "*";
    }
    
    System.out.println(stars);
}

String에 공백도 문자도 없는 값을 저장한다.

j for문이 반복되는 만큼 String에 *이 저장되고 종료되면 stars가 출력된다.

  1. i = 1

  → j = 1 → j <= i → true → stars에 * 저장 → j ++ → j = 2 → j <= i → false → j for문 종료

→ stars 출력 → * 출력됨 → i ++

  2. i = 2

  → j = 1 → j <= i → true → stars에 * 저장 → j ++ → j = 2 → j <= i → true → stars에 * 저장

→ j ++ → j = 3 → j <= i → false → j for문 종료 → stars 출력 → ** 출력됨 → i ++

  3. i = 3

....................

  위와 같은 단계 반복

 

 


 

② 위에서부터 아래쪽으로 작아지는 역 직각삼각형 만들기

역 직각삼각형은

첫 줄에 사용자가 입력한 숫자만큼의 별 개수가

두 번째 줄은 사용자가 입력한 숫자 - 1개 별 개수가 출력된다.

 

1) 사용자 입력값을 저장한 j for문

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

number가 10이라고 했을 때

  1. i = 1

  → j = 10 → j >= i → true → * 출력 → j-- → j = 9 → j >= i → true → * 출력 →...

→ j = 1 → j >= i → true → * 출력 → j-- → j = 0 → j >= i → false → j for문 종료 → println() 실행

→ i++

  10부터 1까지 총 *이 10개 출력된 것을 알 수 있다.

  * 출력 시 print()를 사용했기 때문에 앞에 출력된 *의 바로 오른쪽에 *가 출력된다.

  i++ 가 되기 전 println()로 줄 바꿈이 실행되어 다음 단계에 출력될 *는 그 아래 줄에 출력되는 것을 알 수 있다.

  2.  i = 2

  → j = 10 → j >= i → true → * 출력 → j-- → j = 9 →....

  위와 같은 단계 반복


2) 문자열 사용

for(int i = 1; i <= number; i++) {
    String stars = "";
    
    for(int j = i; j <= number; j++) {
        stars += "*";
    }
    System.out.println(stars);
            
}

이 for문의 경우 j 값이 i 값으로 초기화되므로

i가 1일 때는 j도 1이므로 1부터 number 만큼 반복 출력

i가 2일 때는 j도 2이므로 2부터 number 만큼 반복 출력

i, j 값이 number와 같아질 때까지 반복된다.

 


 

③ 오른쪽에서 시작되는 직각삼각형 만들기

여기서부터 머리가 아파지는데,,,🪐

왜냐하면 별은 i만큼 출력되고 공백이 number - i만큼 출력돼야 하기 때문이다.

막상 글로 적어놓으니까 쉬워 보이네요,,,?

하지만 j for문이 2개 쓰인다는 점!

공백 j for문, 별 j for문이 필요하다.

 

1) 공백과 별 바로 출력하기

for (int i = 1; i <= number; i++) {
    
    // 공백 j for문
    for(int j = number-1; j >= i; j--) {
        System.out.print(" ");
    }
    
    // 별 j for문
    for(int j=1; j <=i; j++) {
        System.out.print("*");
    }
    
    System.out.println("");
}

첫 번째 j for문은 공백 출력을 담당한다.

첫 줄에서 별이 i개가 나오고 공백은 사용자 입력 수 - 1 이므로 j = number - 1로 초기화했다.

만약 number - i로 했을 경우

number가 10이고 i 가 1일 때 공백은 9개, i가 2일 때 j는 8이므로 공백이 7개가 출력된다.

즉, 2번째 줄부터 목표했던 모양이 안 나오기 시작하는 것이다.

그래서 고정값인 -1을 줬다.

두 번째 j for문은 i수만큼 별이 출력되는 것을 위 예시들을 통해서 미리 알 수 있었다.


2) 문자열 사용

for(int i =1; i <= number; i++) {
    String stars = "";
    
    for(int j = 1; j <= number - i; j++) {
        stars += " ";
    }
    
    for (int j = 1; j <= i; j++) {
        stars += "*";
    }
    
    System.out.println(stars);
}

이 경우엔 첫 번째 j for문에서 j를 1로 초기화했기 때문에 조건식이 number - i가 가능한 것이다.

 


 

④ 오른쪽 기준 역 직각삼각형 만들기

2번과 유사하지만 공백 수가 중요하다.

첫 번째 줄에 사용자 입력 수 만큼 별 출력, 두 번째 줄은 사용자 입력 수 - 1, 세 번째 줄은 사용자 입력 수 -2... 

마지막 줄에는 *이 1개 출력된다.

공백은 첫 번째 줄에 0개, 두 번째 줄에 1개, 세 번째 줄에 2개,,,, 마지막 줄에 사용자 입력 수 - 1개만큼 출력된다.

 

1) 공백, 별 직접 출력

for(int i = 1; i <= number; i++) {

    // 공백 j for문
    for(int j = 1; j < i; j++) {
        System.out.print(" ");
    }
    
    // 별 j for문
    for(int k = number; k >= i; k--) {
        System.out.print("*");
    }
    
    System.out.println("");
}

2) String 사용

for(int i = 1; i <= number; i++) {
    String stars = "";
            
    for(int j = 1; j <= number; j++) {
        
        // 공백 if 문
        if(j<=i-1) {
            stars += " ";
          
        // 별 else 문  
        } else {
            stars += "*";
         }
    }
    
    System.out.println(stars);
}

if - else 구조를 통해 j for문 1개로 공백과 별을 출력할 수 있다.

  1. i = 1

  → j = 1 → j <= number → true → if 조건식 j <= i -1 → false → else 문 stars에 * 추가 → j++ →...

→ j for문 종료 → stars 출력 → i ++

  총 사용자 입력 수만큼 *이 출력된 것을 알 수 있다.

  2. i = 2

  → j = 1 → j <= number → true → if 조건식 j <= i - 1 → true → stars에 공백 추가 → j ++ → j = 2 → j <= number → true → if 조건식  j <= i - 1 → false → else 문 stars에 * 추가 → j ++ → j <= number →...

  위와 같은 단계 반복

  총 공백 1개, 사용자 입력 수 - 1개만큼 *이 출력된 것을 알 수 있다.

 


 

⑤ 피라미드 만들기

두둥!

삼각형도 어려웠는데 피라미드 등장! 🔥

별부터 차근차근 살펴보면

첫 번째 줄에 별 1개

두 번째 줄에 별 3개

세 번째 줄에 별 5개

...

마지막 줄에 사용자 입력 수 * 2 -1개

즉 2만큼 증가하는 홀수인 것을 알 수 있습니다.

 

공백

첫 번째 줄에 9개

두 번째 줄에 8개

세 번째 줄에 7개

...

마지막 줄에 0개인 걸로 보아

사용자 입력 수 - i 개 인 것을 알 수 있습니다.

공백 j for문, 별 j for문을 이용해 만들 수 있습니다.

 

1) 공백, 별 바로 출력

for (int i = 1; i <= number; i++) {

    // 공백 j for문
    for (int j = number; j > i; j--) {
        System.out.print(" ");
    }
    // 별 j for문
    for (int j = 1; j <= 2 * i - 1; j++) {
        System.out.print("*");
    }
    // 공백 j for문
    for (int j = number; j > i; j--) {
        System.out.print(" ");
    }
    
    System.out.println("");
    
}

위 코드를 보면 공백 j for문이 2개입니다만 마지막 공백 j for문은 필요 없습니다...

하지만 만약의 경우 오른쪽 공백도 출력을 해야 한다! 하면 입력해주시면 됩니다.

 

  1. i = 1

  1) 공백 j for문

  → j = 10 → j > i → true → 공백 출력 → j-- → j = 9 → j > i → true → 공백 출력 →...

→ j = 1 → j > i → false → 공백 j for문 종료

  2) 별 j for문

  → j = 1 → j <= 2*i -1 → true → * 출력 → j++ → j = 2 → j <= 2*i -1 → false → j for문 종료

→ println(); 실행 → i ++

  2. i = 2

  1) 공백 j for문

  → j = 10 → j > i → true → 공백 출력 → j-- → j = 9 → j > i → true → 공백 출력 →...

→ j = 2 → j > i → false → 공백 j for문 종료

  2) 별 j for문

  → j = 1 → j <= 2*i -1 → true → * 출력 → j ++  → j = 2 → j <= 2*i -1 → true → * 출력 → j++ →

j = 3 → j <= 2*i -1 → true → * 출력 → j ++ → j = 4 → j <= 2*i -1 → false → 별 j for문 종료

→ println(); 실행 →i ++

  .....

  위와 단계 반복


2) String 사용 01

for (int i = 1; i <= number; i++) {
    String stars = "";

    // 공백 j for문
    for (int j = 1; j <= number - i; j++) {
        stars += " ";
    }

    // 별 j for문
    for (int j = 1; j <= 2 * i - 1; j++) {
        stars += "*";
    }

    System.out.println(stars);
    
}

 


3) String 사용 02

for (int i = 1; i <= number; i++) {
    String stars = "";

    // 공백 j for문
    for (int j = i; j < number; j++) {
        stars += " ";
    }

    // 별 j for문
    for (int j = 1; j <= 2 * i - 1; j++) {
        stars += "*";
    }
    
    System.out.println(stars);
}

 


4) 변수 사용

int min = number;
int max = number;

for (int i = 1; i <= number; i++) {
    for (int j = 1; j <= 2 * number - 1; j++) {
        if (j >= min && j <= max) {
            System.out.print("*");
        } else {
            System.out.print(" ");
        }
    }
    System.out.println("");
    min--;
    max++;
}

 


 

⑥ 역 피라미드 만들기

피라미드와 반대로

별 개수가

첫 째 줄에서 2 * 사용자 입력 수 - 1

둘째 줄 2 * 사용자 입력 수 - 1 - 2

...

마지막 줄에서 1개

즉 2 * 사용자 입력 수 - i 개입니다.

 

공백 수는

첫 줄 0개

둘째 줄 1개

세 번째 줄 2개...

i - 1개씩 증가하는 것을 알 수 있습니다.

 

1) j for문

for (int i = 1; i <= number; i++) {
    // 왼쪽 공백 j for 문
    for (int j = 1; j < i; j++) {
        System.out.print(" ");
    }
    
    // 별 j for문
    for (int j = i; j <= 2 * number - i; j++) {
        System.out.print("*");
    }

    // 오른쪽 공백 j for문
    for (int j = 1; j < i; j++) {
        System.out.print(" ");
    }
    
    System.out.println("");

}

2) String 사용 01

for (int i = 1; i <= number; i++) {
    String stars = "";

    // 공백 j for 문
    for (int j = 1; j <= i - 1; j++) {
        stars += " ";
    }

    // 별 j for 문
    for (int j = 1; j <= 2 * number + 1 - 2 * i; j++) {
        stars += "*";
    }

    System.out.println(stars);
}

 


3) String 사용 02

for (int i = number; i >= 1; i--) {
    String stars = "";

    // 공백 j for문
    for (int j = 1; j <= number - i; j++) { 
        stars += " ";
    }

    // 별 j for문
    for (int j = 1; j <= 2 * i - 1; j++) {
        stars += "*";
    }

    System.out.println(stars);
}

 

같은 모양도 다양한 방법으로 출력할 수 있다.


 

⑦ 세로로 긴 삼각형 만들기 01

출력된 줄 수는 사용자 입력 수 * 2 - 1이다.

영역 나누기 예시 01
영역 나누기 예시 02

자세히 보면 별의 개수가 사용자 입력수만큼 출력되는 줄이 있는데,

그 줄을 기준으로 위, 아래로 나눠서 윗부분 for문, 아래 부분 for문으로 출력할 수 있다.

 

1) 윗 삼각형 길게 출력

for(int i = 1; i <= number; i++) {
            
    // 별 j for문
    for(int j = 1; j <= i; j++) {
        System.out.print("*"); 
    }
    
    System.out.println(""); 
}
        
for(int i =1; i <= number-1; i++) {
    
    // 별 j for문      
    for(int j = number-1; j>=i; j-- ) {
        System.out.print("*");         
    }
    
    System.out.println("");
}

첫 번째 i for문과 두 번째 i for문의 가장 큰 차이점은 i 조건식과 j for문의 변화조건식이다.

 


2) 윗 삼각형 길게 출력 & String 사용

for(int i = 1; i <= number; i++) {

    for(int j = 1; j <= i; j++) {
        System.out.print("*");
    }
    System.out.println("");
}
        
for(int i = 2; i <= number; i++) {
            
    String stars = "";
              
    for(int j = i; j <= number; j++) {
        stars += "*";
    }
    System.out.println(stars);     
}

 

 


3) 윗 삼각형 짧게 출력

for(int i = 1; i < number; i++) {

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

for(int i = 1; i <= number; i++) {
            
    String stars = "";
              
    for(int j = i; j <= number; j++) {
        stars += "*";
    }
    System.out.println(stars);
}

 


⑧ 세로로 긴 삼각형 만들기 02

7번과 비슷하지만 다른 점은 공백수가 사용자 입력한 수 - 별의 개수 만큼 있어야 한다는 점이다.

 

1) i for문 2개 사용

for(int i = 1; i <= number; i++) {
    String stars = "";
    
    //1. 증가
    for(int j = 1; j <= number - i; j++) {
        stars += " ";
    }
           
    for(int j = 1; j <= i; j++) {
        stars += "*";
    }
    
    System.out.println(stars);          
}
        
for(int i = 1; i < number; i++) {
     String stars = "";
            
    //2. 감소
    for(int j = 1; j <= i; j++) {
        stars += " ";
    }
            
    for(int j = 1; j <= number - i; j++) {
       stars += "*";
    }
    
    System.out.println(stars);
}

 


2) i for문 조건식 범위를 출력되는 줄 수만큼으로 설정

for(int i = 1; i <= 2 * number-1; i++) {
    String stars ="";

    if (i < number) {
        
        // 공백 j for문
        for(int j = 1; j <= number -i; j++) {
            stars += " ";
        }
                
        // 별 j for문
        for(int j = 1; j <= i; j++) {
            stars += "*";
        }
                
    } else {
        int lowerI = i - number + 1;
        
        // 공백 j for문
        for(int j = 1; j <= lowerI-1; j++) {
           stars += " ";
        }
                
        // 별 j for문
        for(int j = lowerI; j <= number; j++) {
            stars += "*";
        }
                
    } //if-else중괄호
    
    System.out.println(stars);
    
} //i for문 중괄호

 


 

⑨ 마름모 만들기

위 삼각형처럼 섹션을 2 개로 나눠서 생각해야 편하다.

출력되는 줄 수는 사용자 입력 수 X 2 -1 줄이다.

별은 가장 많이 출력되는 개수가 사용자 입력 수 X 2 -1개이며 2n-1개씩 증가한다.

 

1) i for문 2개 사용

for(int i = 1; i <= number; i++) {

    // 왼쪽 공백
    for(int j = number; j > i; j--) {
        System.out.print(" ");
    }
    
    // 별 개수
    for(int k = 1; k <= 2*i-1 ; k++) {
        System.out.print("*");
    }
    
    // 오른쪽 공백
    for(int l = number; l > i; l--) {
        System.out.print(" ");
    }
    
    System.out.println("");
}

for(int i = 1; i < number; i++) {

    // 왼쪽 공백
    for(int j = 1; j <= i; j++) {
        System.out.print(" ");
    }
    
    // 별 수
    for(int k = i; k < 2*number - i-1; k++) {
        System.out.print("*");
    }
            
    // 오른쪽 공백
    for(int j = 1; j <= i; j++) {
        System.out.print(" ");
    }
    
    System.out.println("");
}

2) i for문 1개 사용 & 변수 사용

for(int i = 1; i <= 2*number -1; i++) {
    String stars = "";
           
    // i번째 줄의 공백 갯수를 저장할 int 변수
    int spaceWidth = 0;
            
    // i번째 줄의 별 갯수를 저장할 int 변수
    int starWidth = 0;
            
    // if - else 구조
    // spaceWidth와 starWidth의 값을 결정한다.
    if (i < number) {
        
        // 공백 개수 (number-1 ~ 1)
        spaceWidth = number -i;
        // 별 개수
        starWidth = 2*i -1; 
        
    } else { 
               
        int lowerI = 2*number-i;
        // 공백 개수 (0 ~ number-1)
        spaceWidth = number -lowerI;
        // 별 개수 (2*number-1 ~ 1)
        starWidth = 2*lowerI -1;
    }
            
    // spaceWidth번 반복하면서 stars에 공백을 추가하는 j for문
    for(int j = 1; j <= spaceWidth; j++) {
        stars += " ";
    }
            
   // starWidth번 반복하면서 stars에 별을 추가하는 j for문
    for(int j = 1; j <= starWidth; j++) {
        stars += "*";
    }
            
   System.out.println(stars);
}

 


 

⑩ 속 빈 마름모 만들기

3 부분으로 섹션을 나눠서 생각하는 것이 편하다.

제일 첫 줄과 마지막 줄은 공백 없이 모두 별로 출력된다.

개수는 사용자 입력 수 X 2 - 1 개 이므로 줄 수만큼 출력되는 것을 알 수 있다.

그렇다면 if 문을 사용하여 i가 1일 때 와 i가 사용자 입력 수 X 2 - 1 일때만 별이 출력될 수 있도록하고

else if문과 else 문을 사용해 마름모를 2 섹션으로 나눠 윗 부분, 아랫 부분 공백, 별에 해당하는 변수를 만들어

출력될 수 있도록 한다.

 

1) if - else if - else 구조 & 변수 사용

for (int i = 1; i <= 2 * number - 1; i++) {
    String stars = "";

    // 공백 개수 저장 변수
    int spaceWidth = 0;

    // 별 개수 저장 변수
    int starWidth = 0;

    if (i == 1 || i == 2 * number - 1) {
        for (int j = 1; j <= 2 * number - 1; j++) {
            stars += "*";
        }

    } else if (i < number) {
        // 윗부분

        // 윗부분의 변환된 i의 값을 저장할 int 변수
        int upperI = i - 1;
        starWidth = number - upperI;

        // 공백 1, 3, 5...
        spaceWidth = 2 * upperI - 1;

    } else {
        // 아랫부분

        // 아랫부분의 변환된 i의 값을 저장할 int 변수
        int lowerI = i - number + 1;
        starWidth = lowerI;
        spaceWidth = 2 * number - 2 * lowerI - 1;
    }

    // 왼쪽 별 담당 j for문
    for (int j = 1; j <= starWidth; j++) {
        stars += "*";
    }

    // 공백 담당 j for문
    for (int j = 1; j <= spaceWidth; j++) {
        stars += " ";
    }

    // 오른쪽 별 담당 j for문
    for (int j = 1; j <= starWidth; j++) {
        stars += "*";
    }

    System.out.println(stars);
}
반응형