FireDrago

[java] 피라미드, 역피라미드 만들기 본문

프로그래밍/Java

[java] 피라미드, 역피라미드 만들기

화이용 2023. 4. 24. 17:11

<원하는 기능>

1. 사용자에게 역피라미드를 만들지, 정피라미드를 만들지 묻는다.

2. 사용자가 원하는 줄 수 만큼 역피라미드 or 정피라미드를 출력한다.

 

우선 * 피라미드를 쌓기위해서 모양을 살펴보자

___*    //1줄 : 공백 3 별 1
__***   //2줄 : 공백 2 별 3
_*****  //3줄 : 공백 1 별 5
******* //4줄 : 공백 0 별 7

매 줄 마다  (i줄, 공백 j, 별 k) 가 반복된다. 따라서 공백 j 와 별 k는 i 에 들어가는 이중 for문의 형태가 된다

 

그런데 공백 j 와 별 k는 매 줄마다 값이 변한다. 따라서 공백 j와 별 k는 이중 for문관계가 성립하지 않는다.

 

이를 바탕으로 피라미드를 생성하는 코드는 다음과 같다.

class MkPy {
	void makeP (int a)  {
	int line = a;
    for (int i=1; i<=line; i++) { // 줄 수 i는 1씩 규칙적으로 증가
        for (int j=line-i; j>=1; j--) { // 공백은 줄 수에서 하나 감소한 값부터 1씩 감소
            System.out.print(" ");
        }
        for (int k=1; k<=2*i-1; k++) { // * 은 매줄마다 2개씩 증가
            System.out.print("*");
        }
        System.out.println();
    }

 

역피라미드는 별이 찍히는 순서가 정피라미드와 반대이므로 이를 고려해서 코드를 만든다.

class MkPy {
	void makeP (int a)  {
		int line = a;
		for (int i=1; i<=line; i++) {
			for (int j=line-i; j>=1; j--) {
				System.out.print(" ");
			}
			for (int k=1; k<=2*i-1; k++) {
				System.out.print("*");
			}
			System.out.println();
		}
	}

	void revP (int a) { //역피라미드 찍는 함수
		int line = a;
		for (int i=1; i<=line; i++) { //줄 수 는 1씩 증가
			for (int k =0; k<i-1; k++) { //역 피라미드 공백은 0부터 줄수-1 까지 
				System.out.print(" ");
			}
			for (int j=1; j<=(2*a+1)-(2*i); j++) { //역피라미드 *은 (2*line+1)-(2*줄수)
				System.out.print("*");
			}
			System.out.println();
		}
	}
}

이렇게 역피라미드, 정피라미드를 만드는 메서드를 정의한 클래스가 만들어 졌다.

 

이제 main 함수를 정의해보자

public class PyramidClass {

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

    MkPy d = new MkPy(); //피라미드 그리기 메서드가 정의된 클래스 인스턴스화 
                         // 반복문 밖으로 빼서 한번만 만들자 (반복문 안 프로세스 낭비)
    while(true) {
        System.out.println("어떤 피라미드를 만드시겠습니까? (역/정)");
        String answer = ss.nextLine(); //정, 역 피라미드 선택하기위한 변수

        

        if (answer.equals("역")) { // "역" 입력시 revP() 메서드 실행
            System.out.println("몇 줄의 역 피라미드를 만들래? (숫자)");
            int line = sc.nextInt(); // 원하는 줄 수를 입력받는다.
            d.revP(line);

        } else if (answer.equals("정")) { // "정" 입력시 makP() 메서드 실행
            System.out.println("몇 줄의 피라미드를 만드시겠습니까?");
            int line = sc.nextInt();
            d.makeP(line); 

        } else {                // 역 , 정 아닌 다른값 입력시 반복문의 처음으로 돌아간다
            System.out.println("\"역\",\"정\" 둘 중 하나만 입력해주세요");
            
        }
    }
}

코드를 완성시키면

package chapter06;

import java.util.Scanner;

class MkPy {
	void makeP (int a)  {
		int line = a;
		for (int i=1; i<=line; i++) {
			for (int j=line-i; j>=1; j--) {
				System.out.print(" ");
			}
			for (int k=1; k<=2*i-1; k++) {
				System.out.print("*");
			}
			System.out.println();
		}
	}

	void revP (int a) {
		int line = a;
		for (int i=1; i<=line; i++) {
			for (int k =0; k<i-1; k++) {
				System.out.print(" ");
			}
			for (int j=1; j<=(2*a+1)-(2*i); j++) {
				System.out.print("*");
			}
			System.out.println();
		}
	}
}

public class PyramidClass {

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

        MkPy d = new MkPy();

		while(true) {
			System.out.println("어떤 피라미드를 만드시겠습니까? (역/정)");
			String answer = ss.nextLine();

			
			if (answer.equals("역")) {
				System.out.println("몇 줄의 역 피라미드를 만드시겠습니까? (숫자입력)");
				int line = sc.nextInt();
				d.revP(line);
				
			} else if (answer.equals("정")) {
				System.out.println("몇 줄의 피라미드를 만드시겠습니까?");
				int line = sc.nextInt();
				d.makeP(line); 
				
			} else {
				System.out.println("\"역\",\"정\" 둘 중 하나만 입력해주세요");
				continue;
			}

		}


	}

}

콘솔창에서 확인해보자

잘 작동한다