티스토리 뷰

 

 다이아몬드 구조를 가진 패턴을 for문을 활용해서 만들려고 한다. 

for문을 두개 활용하면, 간단하게 만들 수 있는 구조 이지만

하나의 for문을 가지고 다이아몬드 구조를 만들기는 어렵다. 

그 이유는 다음과 같다.

  중앙값(정 중앙의 별의 갯수) 이 5인 다이아몬드 패턴을 만들면, 빈 공간의 수는 2칸 1칸 0칸으로 줄었다가 다시 1칸 2칸으로 늘어난다.  

그럼 for문이 루프함에 따라 루프수 2,1,0,1,2 가 나와야 하는데 일반적인 for문의 구조를 살펴보면서 생각해보자

 

for (int a=0;a<3;a++)
{ 
 for(int b=2;b>a;b--);
 System.out.print(" ");
 }
 }

이 다중 for문에서  b값은 점점 감소하도록 구조를 만들었다. 

이렇게 되면 루프수가 2,1,0  되서 앞의 빈공간을 만들 수 있지만, 1,2로 증가하는 루프수는 만들 수 없다. 

 즉 쉽게 풀어서 설명하면 하나의 for만을 사용해서 다이아 패턴을 만드는건 불가능하다. 왜냐하면 for문은 증가 혹은 감소 형태로 이루어져있기 때문에 감소했다가 증가하는 루프를 생성하는건 for문만을 가지고는 불가능하다

하지만, for문과 if문을 함께사용하면 하나의 루프로도 만들 수 있는데 이를 다루기 전에 

일반적으로 다이아 패턴을 만들때 사용하는 방법을 먼저 사용해봤다. 

 

                  

일반적으로 for문을 가지고 다이아 패턴을 출력하는 방법 

 

 먼저 a항목을 for문을 활용해 구조를 갖추게하고 a항목의 for문이 끝나면

바로 b항목이 실행되게 해서 다이아 형태로 구조를 갖추게한다. 

 

중앙값을 기준이 5인 다이아 형태를 만들기 위해서,

우선  빈공간이 2,1 별의 갯수가 1,3,5 을 증가하는 a항목의 다중 for문을 만들고 

그 뒤에 빈 공간이 1,2 별의 갯수가 3,1인 b 다중 for문을 만든다 

아래의 코드를 참조해보자

for(int a=1;a<4;a++)
		{
			for(int b=3;b>a;b--)
			{
				System.out.print(" ");
			}
			for(int c=0;c<a*2-1;c++)
			{
				System.out.print("*");
			}
			System.out.println("");
		}

전에  사용했던 정 삼각형패턴 이랑 똑같은 구조를 가진 for문이다. 이 함수를 할용하면 a구조는 완성이 된다.

b구조도 a구조와 비슷한 방식으로 만들어 준다.

		for(int a=1;a<3;a++)
		{
	     for(int b=0;b<a;b++) {
	    	 System.out.print(" ");
	     }
	     for(int c=4;c>a*2-1;c--)
	     {
	    	 System.out.print("*");
	     }
	     System.out.println("");
		}//b구조

 

 

코드를 만들고 나서, 둘을 순서대로 나열하면 다이아 몬드 패턴이 나온다.

a 구조와 b구조가 순서대로 출력이 되면서, 다이아몬드 형태의 패턴이 완성이 됐다. 

 

 

 여기까지는 프로그램을 제작하는데 무리가 없었지만 하나의 루프를 가지고 다이아몬드 패턴을 프로그래밍 하는 것은 공부가 필요했다. 그래서 구글링을 통해 이해를 돕기위한 자료를 참조했고, 내가 참조한 코드의 출처와 코드를 첨부한다.

출처: stackoverflow.com/a/33406795

 

How to make a diamond using nested for loops

So I was assigned to make a diamond with asterisks in Java and I'm really stumped. Here's what I've come up with so far: public class Lab1 { public static void main(String[] args) { for...

stackoverflow.com

public class Diamond {
    public static void main(String[] args) {
        int size = 9,odd = 1, nos = size/2; // nos =number of spaces
        for (int i = 1; i <= size; i++) { // for number of rows i.e n rows
            for (int k = nos; k >= 1; k--) { // for number of spaces i.e
                                                // 3,2,1,0,1,2,3 and so on
                System.out.print(" ");
            }
            for (int j = 1; j <= odd; j++) { // for number of columns i.e
                                                // 1,3,5,7,5,3,1
                System.out.print("*");
            }
            System.out.println();
            if (i < size/2+1) {
                odd += 2; // columns increasing till center row 
                nos -= 1; // spaces decreasing till center row 
            } else {
                odd -= 2; // columns decreasing
                nos += 1; // spaces increasing

            }
        }
    }
}

여기에 사용된 주석은 건들이지 않고, 어떤식으로 동작하는지 내가 이해한점을 바탕으로 차근차근 정리해둔다. 

 

for문안에서 지정하지 않은 변수가 3개가 있다. 이 값들은 for문 안에 있지 않기 때문에,  for문을 벗어나도 값이 초기화 되지 않는다. 

여기서 size값은 어떤 값을 넣어도 되지만(다이야 패턴의 크기를 말한다.) 홀 수를 넣어야 다이야 패턴이 나온다.

나머지 두 값은 고정값으로 이는 마지막 if문과 연관이 있는 변수들로 잠깐 미뤄둔다 

for (int i = 1; i <= size; i++) { // for number of rows i.e n rows
            for (int k = nos; k >= 1; k--) { // for number of spaces i.e
                                                // 3,2,1,0,1,2,3 and so on
                System.out.print(" ");
            }
            for (int j = 1; j <= odd; j++) { // for number of columns i.e
                                                // 1,3,5,7,5,3,1
                System.out.print("*");
            }

일단 for문의 묶음이다. 여기서 살펴볼점은 

첫번째 for문에서 입력받은 size를 기준으로 실행이 되는데 지금은 9의 값을 넣었으므로 

이 루프는 총 1부터 (<=연산자를 활용했으니) 9까지 9번 반복이 된다. 

밑의 다중 포문을 살펴보면 

k값은 nos와 동일한데 nos값은 아까도 말했듯이 size/2 이므로 9/2 4.5 int로 지정했으니 소숫값은 사라져 4의 값만 남아 계속 4번씩 루프를 한다. 

j값은 1로 시작해 odd값이랑 비교해 증가하는 구조인데 현재 odd의 값은 1 이므로 한번만 루프한다. 

즉 여기까지 코딩을 진행하면 아마 다음과 같은 화면이 나온다. 

별은 odd값이 1에서 변경되지 않았으므로 계속 하나만 출력할것이고 

빈 공간 또한 nos가 4이므로 4개씩 고정이다.

그럼 이를 다이야 패턴으로 만들기 위해 본격적으로 if문과 else문이 사용된 코드를 분석해 보자.

 

 if (i < size/2+1) {
                odd += 2; // columns increasing till center row 
                nos -= 1; // spaces decreasing till center row 
            } else {
                odd -= 2; // columns decreasing
                nos += 1; // spaces increasing

            }

if문의 조건식을 풀어서 설명해보면

(i가 size값을 2로 나눈값에 1을 더한값보다 크면 참)

이런 구조로 설계한 이유는 쉽게 설명하면 행이 중앙에 도달할때까지 if문을 실행시키게 하기 위해서다

자세히 설명하면 우리가 다이야몬드 패턴을 보여주기 위해서는 5행까지는 빈공간이 감소하고 별이 증가해야하고

6행부터는 빈공간이 증가하고 별이 감소해야하기 때문이다.

5가 기준인 다이야 패턴 중앙값(3행)까지는 빈공간이 감소하고 별이 증가한다.

즉 현재 사이즈는 9이므로 9의 중앙값은 5이다 이를 조건으로 표현하기 위해 size/2+1을 한것이다. 

if문은 위에서 설명한 조건대로 1값이 4가 되는 시점까지 밑의 if문을 실행하고 아닌경우 else문을 실행한다.

바로 이부분에서 별의 갯수와 빈공간을 조정한다. 

if문을 살펴보면 odd+=2 이고 nos-=1인데 이는 별의 갯수는 2를 늘리고 빈공간의 숫자는 1을 감소시켰다. 

else문은 정반대 이다. odd값과 nos값은 밖에서 변수를 지정했기때문에 for문 이 실행되는 동안 계속 바뀔것이고 

이를 활용해 별의 갯수와 빈 공간의 수를 마음대로 설정할 수 있다. 

 이 코드를 간단하게 한 줄로 요약하자면 

'for문 자체는 변하지 않았지만, if문을 활용한 nos값과 odd값을 임의로 변경해서 원하는 패턴을 싱글루프로 실행할 수 있게한 코드'

이다.

실행화면이다. 

 

이제  이 프로그램 코드의 구조를 통해 싱글루프로 다이야 패턴을 만들 수 있게 됐으니 

간단하게 몇개의 기능을 가진 패턴 출력기를 만들어 봤다. 

규칙을 3가지를 세우고 코드를 만들었다. 

1.입력기를 통해 값을 입력받아 크기를 정할 수 있게 

2. 홀수만 입력할 수 있게 (짝수 입력시 오류 메시지 출력)

3.다이야 패턴을 별을 활용해서 출력 

1)입력기를 통해 값을 입력받아 크기를 정하기

  //import java.util.Scanner; 입력을 위해서 이 항목을 꼭 추가시켜줘야한다. 
  
  Scanner sc =new Scanner(System.in);//스캐너 객체 sc를 만드는 코드이다.
	    System.out.println("패턴의 크기를 정해주세요(홀수):");
	    int size= sc.nextInt();//size 변수의 값은 입력받은 값이 된다. 
	    
	   

Scanner 함수를 활용해 입력기를 만들고 값을 입력받을 수 있도록 코드를 만들었다.  

2)홀수만 입력할 수 있도록 if문 항목 추가 

 if(size%2==1)//사이즈가 홀수라면 아래의 프로그램을 실행한다.
        {

	    }else//아닌 경우 else문 실행
        {
	    	System.out.println("잘못 입력했습니다.");
	    }

if문을 활용해서 입력받은 size의 값이 홀 수일 경우 if문을  실행하도록 작성했고, 아닌 경우는 잘못 입력했다는 메세지를 출력하도록 프로그램을 작성했다. 

3)for문을 활용한 다이야 패턴의 출력 



	    int size= sc.nextInt();
	    int odd=1,nos=size/2;// odd값과 nos값의 변수를 선언했다.
	    

	    	for(int a=1;a<=size;a++) 
            //입력받은 size값에 따라 a포문의 반복횟수 결정
            {
	    		for(int b=1;b<=nos;b++)
                //nos값에 따라 b포문의 반복횟수 결정
                {
	    			System.out.print(" ");
	    		}
	    		for(int c=0;c<odd;c++)
                //odd값에 따라 c포문의 반복횟수 결정
                {
	    			System.out.print("*");
	    		}
	    		
	    		if(a<size/2+1)// a가 size/2+1 보다 작으면 아래의 프로그램을 실행
                {
	    			odd+=2;
	    			nos-=1;
	    		}else//아닐경우 아래의 프로그램을 실행 
                {
	    			odd-=2;
	    			nos+=1;
	    		}
	    		System.out.println("");// a for문이 끝나는 지점마다 줄을 바꿔줌
	    	}

 

이런 구조로 for문을 작성했고 완성된 코드와 실행화면은 아래에 첨부한다. 

package Loop;
import java.util.Scanner;

public class DiamondPrint {

	public static void main(String[] args) {
	    Scanner sc =new Scanner(System.in);
	    System.out.println("패턴의 크기를 정해주세요(홀수):");
	    int size= sc.nextInt();
	    int odd=1,nos=size/2;
	    
	    if(size%2==1) {
	    	for(int a=1;a<=size;a++) {
	    		for(int b=1;b<=nos;b++) {
	    			System.out.print(" ");
	    		}
	    		for(int c=0;c<odd;c++) {
	    			System.out.print("*");
	    		}
	    		
	    		if(a<size/2+1){
	    			odd+=2;
	    			nos-=1;
	    		}else {
	    			odd-=2;
	    			nos+=1;
	    		}
	    		System.out.println("");
	    	}

	    }else {
	    	System.out.println("잘못 입력했습니다.");
	    }

}
}

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함