FireDrago
[java] 피라미드, 역피라미드 만들기 본문
<원하는 기능>
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;
}
}
}
}
콘솔창에서 확인해보자

잘 작동한다
'프로그래밍 > Java' 카테고리의 다른 글
| [java] 입력받은 이름을 가나다 순으로 정렬하기 (for문 사용) (0) | 2023.04.26 |
|---|---|
| [java] 버블정렬 알고리즘 (0) | 2023.04.25 |
| [java] 참조변수 배열로 회원가입 구현하기 (0) | 2023.04.21 |
| [java] 배열의 합 , 2차배열 입출력 (0) | 2023.04.21 |
| [java] 04 반복문의 활용 , 05 배열의 선언과 초기화 (0) | 2023.04.20 |
