유난스런 개발 기록

[JAVA] for문을 활용한 별 찍기 본문

개인 개발 공부 기록

[JAVA] for문을 활용한 별 찍기

yourhwan 2022. 8. 18. 19:44

별 찍기 문제를 풀기 위해서는 반복문의 종류인 for문을 사용할 줄 알아야 하고,

중첩 for문을 다룰 수 있어야한다.

논리적인 사고를 통해

매커니즘을 이해하는 것이 가장 핵심이다.

같은 모양을 만들기 위해서 꼭 같은 코드를 써야하는 것은 아니다.

해결될 때까지 계속 생각해보고 작성해보자,

왜 이 코드가 들어가고, 왜 이 결과가 나왔는지

혼자서 생각해보고 만들어보며 시행착오를 겪는 것이 가장 빠르고 확실한 길이다.

공부했던 별 찍기 문제들을 모아봤다.


 

 

**********

 

위와 같이 1행 10열의 별을 찍기 위해선 어떻게 코드를 작성할까?

가장 기본적인 방법은 아래와 같다.

 

system.out.println("**********");

 

하지만

for문을 이용해서 코드를 작성할 수도 있다.

 

//아래 코드는 system.out.println("**********") 의 출력 결과와 동일하게 나온다.

for (int i=0; i>10; i++) {
	system.out.print("*");
}

 

위와 같이 for문을 활용한다면

몇번이고 반복해서 여러가지 모양을 만들 수 있다.

 

이제 중첩 for문을 활용하여 10행 10열의 별을 찍어보자.

 

for (int i=0; i<10; i++) {
	for (int j=0; j<10; j++) {
    	system.out.print("*");
    }
    		system.out.println();
}

/*위와 같이 코드를 작성하면 아래와 같이 10행 10열의 별이 출력된다.

**********
**********
**********
**********
**********
**********
**********
**********
**********
**********

*/

 

이제부터 본격적으로 다양한 모양의 별을 찍어보자.

 


문제 1.

*
**
***
****
*****
******
*******
********
*********
**********

 

위와 같은 결과를 얻기 위한 코드는 아래와 같다.

정답.

for (int i=0; i<10; i++) {
	for(int j=0; j<=i; j++) {
    	system.out.print("*");
    }
    	system.out.println();
}
//좌표로 표현해서 보면 이해하기 쉽다.
/*좌표로 표현해서 보면
(0,0)
(1,0)(1,1)
(2,0)(2,1)(2,2)
(3,0)(3,1)(3,2)(3,3)
(4,0)(4,1)(4,2)(4,3)(4,4)
(5,0)(5,1)(5,2)(5,3)(5,4)(5,5)
(6,0)(6,1)(6,2)(6,3)(6,4)(6,5)(6,6)
(7,0)(7,1)(7,2)(7,3)(7,4)(7,5)(7,6)(7,7)
(8,0)(8,1)(8,2)(8,3)(8,4)(8,5)(8,6)(8,7)(8,8)
(9,0)(9,1)(9,2)(9,3)(9,4)(9,5)(9,6)(9,7)(9,8)(9,9)
*/

 

간단히 이해하기 위해서

'i''열'

'j''행'이라고 생각하면 편하다.

주석에 실행 결과를 좌표로 풀어서 적어뒀다.

중첩 for문의 매커니즘을 직관적으로 확인할 수 있다.

 


문제 2.

         *
        **
       ***
      ****
     *****
    ******
   *******
  ********
 *********
**********

 

위와 같은 결과를 얻기 위한 코드는 아래와 같다.

 

for (int i=0; i<10; i++) { 					//10열 생성
	for (int j=0; j<9-i; j++) {			    //각 행에서 공백의 갯수는 9-i
    	system.out.print(" ");
    }
    	for (int k=0; k<i+1; k++) {			//*은 각 행에서 i+1 
        	system.out.print("*");
        }
        	system.out.println(); 			//줄바꿈
}

 


문제 3.

**********
*********
********
*******
******
*****
****
***
**
*

 

위와 같은  결과를 얻기 위한 코드는 아래와 같다.

 

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

 

 


문제 4.

**********
 *********
  ********
   *******
    ******
     *****
      ****
       ***
        **
         *

 

문제 3의 결과를 좌우반전 한 것과 같은 모양이다.

코드는 다음과 같다.

for (int i=0; i<10; i++) {
	for (int j=0; j<i; j++) {
    	system.out.print(" ");
    }
    	for (int j=10; j>i; i--) {
        	system.out.print("*");
        }
        	system.out.println();
}

 

지금까지의 문제들은 아주 기본이라고 할 수 있다.

다음으로 내가 애 좀 먹었던 피라미드를 만들어 보자.

 


문제 5.

         *
        ***
       *****
      *******
     *********
    ***********
   *************
  ***************
 *****************
*******************

 

피라미드를 처음 만들겠다고 생각했을 때 

가장 고민이 되었던 부분은 바로

좌우의 공백을 어떻게 코드로 표현하는 것이었다.

내가 짠 코드는 다음과 같다.

for (int i=0; j<10; j++) {
	for (int j=0; j>9-i; j++) {			// 공백의 갯수는 열의 증가값 만큼 줄어든다.
    	system.out.print(" ");				//그러므로 9-i로 표현할 수 있다.
    }
    	for (int k=0;k<2*i+1; k++) {
        	system.out.print("*");		//*의 갯수는 홀수의 규칙을 보인다.
        }					//i가 0일때 1개, i가 1이면 3, 2일 때는 5개
        	system.out.println();		//즉, 2*i+1 만큼 증가한다는 것을 알 수 있다. 
}

 

그렇다면 역피라미드를 만들려면 어떻게 해야할까?

생각만으로는 쉽게 느껴졌지만

코딩 초보인 나는 꽤나 시간이 걸렸다.

단순하게 공백과 별의 코드를 반대로 짜면 되지 않을까? 라고 생각을 했지만

만만하지는 않았다.

매커니즘을 정확하게 이해하고 코드를 작성하는 것이 반드시 필요하다고 했던 이유다.


문제 6.

*******************
 *****************
  ***************
   *************
    ***********
     *********
      *******
       *****
        ***
         *

 

위와 같은 역피라미드를 만드는 코드는 다음과 같다.

 

for (int i=10; i>0; i--) {
	for (int j=0; j<10; j++) {
    	system.out.print(" ");
    }
    	for (int k=0; k<2*i-1; k++) {
        	system.out.print("*");
        }
        	system.out.println();
}

 

이렇게 for문을 활용한 별 찍기 문제들을 풀어보며

기본적인 매커니즘을 이해할 수 있었다.

다음 목표로는 모래시계와 별모양 등 여러가지 모양을 만들어보는 시간을 갖고

조금 더 심화 된 for문을 활용하는 연습을 해야겠다.

가장 크게 느끼는 점은

기존의 공부와 전혀 다른 방법으로 공부해야 한다는 것과

노베이스의 무력감을 이겨내고 문제를 해결할 때마다 성취감을 느끼며

코딩의 매력에 빠져든다는 것이다.

앞으로도 꾸준히 노력하고 기록하자