별 찍기를 해보려 한다.

별 찍기는 이중 for문의 반복연산자를 조정해서 도형을 콘솔에 출력하는 것으로 만든다.

간단한 알고리즘으로 다양하게 응용할 수 있으며

사람마다 찍는 방법이나 사고하는 방법이 다를 수 있다... 나도 왕도가 아니므로

사고 연습하기 좋은 것 같다.

 

메인함수

public static void main(String[] args) {
		
		STAR_01 ss = new STAR_01();
		
		ss.triangle();
		ss.halfTri();
		ss.reverseTri();
		ss.hexagon();
}

총 네 개의 모양을 별로 찍을 것이고,

각각 STAR_01 클래스에서 메서드를 호출해 콘솔에 찍는다.

 

triangle

삼각형이다. 매우 기본적인 도형이다.

꼭지점 좌 우로 한 칸씩 별이 늘어나면 삼각형이 완성이다.

꼭지점을 기준으로 i가 커지면(행이 아래로 내려가면) j가 출력하는 기준도 i에 맞게 변화 시킨다는 것이 포인트다.

void triangle() {
		for(int i = 0 ; i < 5 ; i++) {
			for(int j = 0; j < 9; j++) {
				// 행은 5줄, 열은 9줄
                
				int point = 4; // 중간 점을 찍어줘야 되므로 윗 꼭지점 기준이 됨
                
				if(j >= point-i && j <= point+i) // j의 조건을 i에 맞춰서 설정
                
                // 삼각형은 한 줄이 늘어날 때 마다 중심에서 양 옆으로 하나씩 별이 늘어남
                	System.out.print(" * "); 
                    
				else
                
                // j가 조건이 안 맞으면 공백 출력
					System.out.print("   ");
			}
			System.out.println();
		}
	}

 

halfTri

반쪽짜리 삼각형이다.

꼭지점이 맨 오른쪽에서 시작하는 직각삼각형 모양이라서, 첫 j의 기준점을 맨 오른쪽으로 잡아서

하나씩 앞으로 출력되는 기준을 당긴다.

	void halfTri() {
		for(int i = 0 ; i < 9 ; i++) {
			for(int j = 0; j < 9; j++) {
				
				int point = 8; // 맨 오른쪽이 기준
                
				if(j >= point-i)	
                
                // 8에서 출력 -> 7 8 출력 이런 식으로 첫 출력 번째가 앞으로 당겨짐
					System.out.print(" * ");
				
                else
					System.out.print("   ");
			}
			System.out.println();
		}
	}

 

reverseTri

역삼각형이다.

좀 까다롭기 시작한다.

j가 출력 될 순번을 왼쪽, 오른쪽 다 정해 줘야 한다.

전설 했듯이 j의 값을 i로 계산 하는 것이 효율적이다.

j의 왼쪽은 0 에서 중간으로, j의 오른쪽은 맨 끝에서 중간으로 서로 수렴하게 되어있다.

따라서 한 행씩 내려갈 때마다(i가 커질 때 마다)

j의 왼쪽은 한 칸씩 뒤로 가서 출력하고, j의 오른쪽은 한 칸씩 앞으로 와서 출력이 끝난다.

void reverseTri() {
		for(int i = 0 ; i < 5 ; i++) {
			for(int j = 0; j < 9; j++) {
				
				if(j <= 8-i && j >= i)	
                /* 
                j의 시작은 0 ~ 8 까지 다 출력이므로 
                i가 0이면 저 조건은 j는 8보다 작고 0보다 크면 다 출력이다. 
                i가 1이 되면 j는 1 ~ 7까지 출력하는 것이다.
                */
					System.out.print(" * ");
				else
					System.out.print("   ");
			}
			System.out.println();
		}
	}

 

hexagon

육각형이다.

public static void main(String[] args) {
  
  STAR_01 ss = new STAR_01();
  
//  ss.triangle();
//  ss.halfReverseTri();
//  ss.reverseTri();
  ss.hexagon();
//  ss.star();
 }

중간에 출력 방식이 변화한다.

따라서 구간마다 다른 조건을 넣어줘야 한다.

맨 윗부분은 그냥 삼각형과 같으며 i(행)만 조절해주면 된다.(i범위만 지정하면 된다는 거지)

중간은 걍 다 뽑는거니 쉽고

마지막 역삼각형은 좀 골치가 아프다 ㅎㅎ

void hexagon() {
		for(int i = 0 ; i < 13 ; i++) {
//			System.out.print("i = "+ i);
			
//			if(i >= 8)
//				System.out.printf("i = %d front : %d, end : %d",i,8-(i-8),i-8);
			
			for(int j = 0; j < 9; j++) {
            
				int point = 4; // 그냥 삼각형 뽑을 때의 꼭지점이 되는 기준
                
				if(i <= 3) { // i가 4행까지는 걍 삼각형
					if(j >= point-i && j <= point+i)
						System.out.print(" * ");
					else
						System.out.print("   ");
					
				} else if (i < 3 && i <= 7) { // 5행부터 8행까지는 그냥 네모
					System.out.print(" * ");
					
				} else { // 그 이후의 행은
				
                /*
                i가 0부터 시작하는 것이 아니라 이미 8까지 온 상황이므로
                (i-8)로 i를 0에서부터 시작하는 것 처럼 해줌
                그 후 역삼각형 뽑기
                */
                
					if(j <= 8-(i-8) && j >= i-8) 	
						System.out.print(" * ");
					else
						System.out.print("   ");
				}
			}
			System.out.println();
		}
	}

 

클래스 전체 소스

public class STAR_01 {

	void triangle() {
		for(int i = 0 ; i < 5 ; i++) {
			for(int j = 0; j < 9; j++) {
				
				int point = 4;
				if(j >= point-i && j <= point+i)
					System.out.print(" * ");
				else
					System.out.print("   ");
			}
			System.out.println();
		}
	}
	
	void reverseTri() {
		for(int i = 0 ; i < 5 ; i++) {
			for(int j = 0; j < 9; j++) {
				
				if(j <= 8-i && j >= i)	
					System.out.print(" * ");
				else
					System.out.print("   ");
			}
			System.out.println();
		}
	}
	
	void halfTri() {
		for(int i = 0 ; i < 9 ; i++) {
			for(int j = 0; j < 9; j++) {
				
				int point = 8;
				if(j >= point-i)	
					System.out.print(" * ");
				else
					System.out.print("   ");
			}
			System.out.println();
		}
	}
	
	void hexagon() {
		for(int i = 0 ; i < 13 ; i++) {
			
			for(int j = 0; j < 9; j++) {
				int point = 4;
				if(i <= 3) {
					if(j >= point-i && j <= point+i)
						System.out.print(" * ");
					else
						System.out.print("   ");
					
				} else if (i < 3 && i <= 7) {
					System.out.print(" * ");
					
				} else {
				
					if(j <= 8-(i-8) && j >= i-8)	
						System.out.print(" * ");
					else
						System.out.print("   ");
				}
			}
			System.out.println();
		}
	}
	
	void star() {
		for(int i = 0 ; i < 10 ; i ++) {
			for(int j = 0; j < 9; j++) {
				System.out.print("*");
			}
			System.out.println();
		}
	}
	
	public static void main(String[] args) {
		
		STAR_01 ss = new STAR_01();
		
		ss.triangle();
		System.out.println();
        
		ss.halfTri();
		System.out.println();
        
		ss.reverseTri();
		System.out.println();
        
		ss.hexagon();
		System.out.println();

	}
}

STAR_01의 main 실행 결과

+ Recent posts