today_is

[ for ] 별찍기 - 심화 본문

java

[ for ] 별찍기 - 심화

ye_rang 2023. 12. 1. 13:16

오늘의 목표 >>

이번에는 개수 변화 규칙이 2개인 별찍기를 해보자

 

 


 

Quiz 01 > 마름모 모양

_ _ * _ _ 
_ * * * _ 
* * * * * 
_ * * * _ 
_ _ * _ _

 

 

변화를 파악하기 쉽게,

공백을 _(언더바)로 처리해서 풀어보자 !!

package star;

public class Ex02 {

	public static void main(String[] args) {
		// 	횟수를 제어할 변수를 미리 만들어 두고 
		//	내가 직접 횟수를 변경, 제어 
		
//		_ _ * _ _ 		공백		별	      공백	
//		_ * * * _ 		 2		1		2
//		* * * * * 		 1		3         	1
//		_ * * * _ 		 0		5          	0
//		_ _ * _ _ 
		
			
		int size = 5;		//	5 x 5 칸
		int sp = 2;		//	공백			★★★ sp = size / 2
		int st = 1;		//	문자 
		
		
		
		for (int i = 0; i < size; i++) {	// 전체 사이즈  ( 칸 수 )
			
			for(int j = 0; j < sp; j++) {	// 공백
				System.out.print("_ ");
			}
			for(int j = 0; j < st; j++) {	// 별 
				System.out.print("* ");
			}
			for(int j = 0; j < sp; j++) {	// 공백
				System.out.print("_ ");
			}
			
			System.out.println();   // 한줄 출력 끝나면 줄 바꿈 
			
			
			if(i < size / 2) {	// 전체 중에서 가운데 줄에 도달하지 못했다면 (= 윗부분)
				sp -= 1;
				st +=  2;
			}
			else {	  		// 가운데에 위치한 줄이거나 아랫쪽이라면  
				sp += 1;
				st -= 2;
			}
		}

	}

}

 

 


Quiz 02 > 나비 넥타이

* _ _ _ * 
* * _ * * 
* * * * * 
* * _ * * 
* _ _ _ *

 

package star;

public class Ex04 {

	public static void main(String[] args) {
	
		
//					별(1)			공백			별(2)		
//		# _ _ _ #		1			3			1						
//		# #   # #		2			1			2
//		# # # # #		3			-1			3  --> if 로 처리 
//		# #   # #		2			1			2
//		#       #		1			3			1
		
//		규칙 >>			+= 1			+= 2			+= 1
//					-= 1			-= 2			-= 1
		
		
	//	첫줄 
	int size = 5;			//	사이즈
	int st = 1;			//	별
	int sp = size - st * 2;		//	공백
		
		
		for(int i = 0; i < size; i++) {			//	전체 칸 
							//	무조건 for문에서는 출력할 개수에만 신경쓰기 
			
			for (int j = 0; j < st; j++) {		//	별 1		0, 1, 2
				System.out.print("* ");
			}
			
			for (int j = 0; j < sp; j++) {		//	공백
				System.out.print("_ ");	
			}
			
			for (int j = 0; j < st ; j++) {		//	별 2		0, 2, 4	
				System.out.print("* ");	
				
				if (i == size / 2 && j == 0) {	//	가운데 줄이면서 j 반복의 첫번째에서만 
					j++;	//	j를 한번 더 증가 
					
				}
			}
			System.out.println();   //	한줄 끝나면 한줄 띄우기 
			
			
			if (i < size / 2) {		// 	윗줄	(전체의 절반보다 작을때)			
				sp -= 2;
				st += 1;
				
			}
			else {				//	아랫줄
				sp += 2;
				st -= 1;
			}
		}
		
	}
}

 

별이 두번 나와야하기 때문에 j 를 두번 사용해주어야한다.

행에서 출력되는 순서를 보면 

별(1)   ->   공백   ->   별(2)   이기 때문에 j 를 세번 사용하면서, 순서에 맞게   j  for 문을 만든다.

 

 

또한 나비넥타이는 가운데 줄에 주목하여 문제를 풀어야한다.

가운데 줄만 다시 살펴보자 !

 

가운데 줄은 별만 5개 나오고, 공백은 나오지 않아야한다.

 

그러나 앞 줄과의 별 개수 변화를 보면 , 

별의 개수가 3개가 되기 때문에, 6개의 별이 출력된다. 

원하는 결과값은 별이 5개가 되는 것인데 이를 위해서는 j를 +1 시켜서 j가 1부터 시작하여 출력되도록 하여야한다.

즉, 3번 반복할 j 를 2번만 반복하게 만드는 것이다. 

 

이것은 별(1)에만 적용시켜서

별(1)을 2로 만들고 별(2)는 3으로 그대로 두어, 총 5개가 출력되도록 하자. 

 


 

study_review >>

변화 규칙이 2개이기 때문에, 변화 구조를 파악하기 좀 더 어려웠다.

특히나, 가운데 줄에 대한 처리에서 어려움을 크게 느꼈는데

j for 문의 역할을 떠올리면서 문제를 풀려고 노력했다.

 

j for문은 별과 공백을 출력하는 역할이라는 것을 잊지말자 !! 

 

'java' 카테고리의 다른 글

[ exception ] 예외 처리  (0) 2023.12.03
[ function ]  (0) 2023.12.01
[ for ] 별찍기  (0) 2023.11.30
[ 프로그래머스 java ] 신규 아이디 추천 (Lv.1)  (0) 2023.11.27
[ String ] Luhn 알고리즘 & string 함수  (0) 2023.11.22