Glacier's Daily Log

Java) 자바프로그래밍 반복문 패턴출력 형태 연습하기 본문

Coding/Java

Java) 자바프로그래밍 반복문 패턴출력 형태 연습하기

h__glacier_ 2021. 4. 22. 18:31
반응형

JavaProgramming

자바프로그래밍 중간고사 대비 패턴출력 문제 풀어보기


2학년 전공수업으로 듣고있는 자바프로그래밍.

중간고사 공부중 패턴출력 반복문 예제를 풀어보고 포스팅 해보려고 한다.

 

1) 반복문 패턴 만들기

 

 

1-1) 숫자 다이아몬드 만들기

이런 다이아몬드 형태를 만들기 위해서는

위의 삼각형 코드 / 아래 역삼각형 코드를 나누어서 작성해야 한다.

 

import java.util.*;

class PT1{
  public static void main(String[] args){
    int a = 7;
    for(int i=0; i<a/2+1; i++){
      for(int j=0; j<=a/2-i; j++) System.out.print(" ");
      for(int j=0; j<i*2-1; j++) System.out.print(j+1);
      System.out.println();
    }
    for(int i=0; i<a/2+1; i++){
      for(int j=0; j<i; j++) System.out.print(" ");
      for(int j=0; j<a-i*2; j++) System.out.print(j+1);
      System.out.println();
    }
   }
  }

for문 두개를 활용해서, 위의 for문은 삼각형 모양

밑의 for문은 역삼각형 모양을 나타낸다.

 

위의 삼각형 형태에서는 공백이 a/2-i 개 만큼, 그리고 숫자가 i*2-1개 만큼 있다.

그래서 다중for문을 활용해서 만들어주면 

 

 

이까지가 만들어진다.

 

그리고 밑부분 삼각형은 반대로 생각해주면 된다.

공백은 i만큼

숫자는 a-(i*2) 만큼

 

 

따라서 이런 형태가 나온다.

 

이렇게 한 행마다의 일반항을 만들어주고

for문 범위에 넣어주면

내가 원하는 모양이 나온다.


 

2) 나비모양 별(*) 출력하기

 

위에서 다이아몬드형을 출력하는 법을 알게 되었으니

이제 조금 심화? 된 나비모양을 만들어 보자.

 

 

 

우선, 문제를 접하고 머릿속으로 어떻게 코드를 짜야할지 생각해본다.

우선, 첫번째 행을 보고 생각해보면

별 하나를 출력하는 for문 하나,

공백을 출력하는 for문 하나,

별 하나를 출력하는 for문 하나

이렇게 총 3개의 반복문이 필요하다.

 

그리고 행을 쌓아 가다가

중간의 공백이 없는 포문은 따로 처리해주려고 한다.

다중for문이 아닌, 그냥 라인의 갯수만큼 별을 출력해주고

 

이제 밑의 부분은 다시, 첫번째 코드를 반대로 뒤집어서 생각해주는

 

총 큰 for문 3개로 이루어진 코드로 작성해보려 한다.

 

우선 

 

 

이 부분을 만들어 보자.

라인이 총 13개니까, 입력값을 13으로 두고 시작한다.

//나비출력
    int z = 13;
    for(int i=1; i<=z/2; i++){
      for(int j=0; j<i; j++) System.out.print("*");
      for(int j=0; j<z-2*i; j++) System.out.print(" ");
      for(int j=0; j<i; j++) System.out.print("*");
      System.out.println();
    }

큰 for문의 범위는, 입력값을 2로 나눈 몫이다.

왜냐하면 밑의 부분과, 중간의 공백 없는 부분은 뺐기 때문이다.

 

별을 i개 만큼 출력해주고 사이에 일반항 z-(2*i) 만큼의 공백을 출력해주면

해당 모양이 나온다.

 

이렇게 일반항을 생각해놓으면 빨리 만들어 볼 수 있다.

 

 

 

그리고 이 중간의 일자 모양.

이 모양을 다이아몬드 코드때 했던 것 처럼, 위/아래로 나눠서 윗부분 코드에 넣어줘도 될것 같지만

중간 부분은 갯수가 맞지 않는다.

그래서 위/중간/아래 이렇게 3개로 나누어서 작성했다.

 

이렇게 3개로 나누면 위/아래는 완벽한 대칭이 되기 때문에 알아보기가 쉬워진다.

 

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

이렇게 매우 간단하게 z의 수만큼 별을 출력해준다.

 

 

 

그러면 이제 이모양 까지는 만들어 진 것이다.

 

남은 밑부분을 완성해보자.

 

 

 

윗부분 코드의 대칭으로 생각하면 편하다.

 

앞부분 별 일반항 : (z/2)-i+1

중간 공백 일반항 : (i*2)-1

뒷부분 별 일반항 : (z/2)-i+1

 

이렇게 일반항을 세우고, 다중 for문에 대입해보면

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

이런 코드가 나온다.

 

그래서 이때까지 작성한 코드를 모아보면

//나비출력
    int z = 13;
    for(int i=1; i<=z/2; i++){
      for(int j=0; j<i; j++) System.out.print("*");
      for(int j=0; j<z-2*i; j++) System.out.print(" ");
      for(int j=0; j<i; j++) System.out.print("*");
      System.out.println();
    }
    for(int i=0; i<z; i++){
      System.out.print("*");
    }
    System.out.println();
    for(int i=1; i<=z/2; i++){
      for(int j=0; j<z/2-i+1; j++) System.out.print("*");
      for(int j=0; j<i*2-1; j++) System.out.print(" ");
      for(int j=0; j<z/2-i+1; j++) System.out.print("*");
      System.out.println();
    }

이러한 코드가 나오고, 실행해보면

 

 

이렇게 완벽하게 출력되는 모습을 볼 수 있다.

 

3) 숫자 대칭 다이아몬드 패턴 출력

 

이제 연습을 충분히 해 보았으니 난이도가 많이 높은 문제.

숫자 대칭 다이아몬드 패턴

 

 

 

우선, 1번의 숫자 다이아몬드와는 많이 다르다.

어떻게 시작해야할지 생각해보자.

 

두 번 째 행을 보면, 공백 + 숫자 + 숫자 로 이루어진다.

 

 

 

이렇게 4개로 나누어서 보는것이다.

 

그러면, 윗부분 코드를 짜보자.

 

int p = 9;

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

9개의 라인을 입력받는다고 하고,

우선 윗부분은 p/2+1 만큼의 라인을 담당한다.

 

그리고 다중for문을 통해

공백은 p/2-i+1 만큼 출력

그리고 i개만큼의 i-j-1 을 출력,

그리고 i-1 개 만큼의 j+1 을 출력

 

이렇게 총 3개를 출력해준다.

여기서 "i개만큼의 i-j-1 을 출력" 이부분이 생각하기 엄청 어려웠는데

또 막상 다시 보면 간단한 알고리즘이다.

 

밑부분은

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

윗부분의 대칭이라고 생각해서

범위를 바꿔주면 된다.

 

그래서 최종 코드는

  int p = 9;
    for(int i=1; i<=p/2+1; i++){
      for(int j=0; j<p/2-i+1; j++) System.out.print(" ");
      for(int j=0; j<i; j++) System.out.print(i-j-1);
      for(int j=0; j<i-1; j++) System.out.print(j+1);
      System.out.println();
    }
    for(int i=1; i<=p/2; i++){
      for(int j=0; j<i; j++) System.out.print(" ");
      for(int j=0; j<p/2-i; j++) System.out.print(p/2-i-j);
      for(int j=0; j<p/2-i+1; j++) System.out.print(j);
      System.out.println();
    }

이렇게 생각보다 간단하게 나온다.

 


이렇게 총 3개의 반복문 문제를 풀어봤다.

생각보다 난이도가 많이 높아서 걱정된다.

 

조금 더 연습해보아야겠다 :0,,,

반응형
Comments