본문 바로가기
자바과정/과제물

(Java) 별찍기 예제

by Parkej 2021. 1. 30.

5번과 6번은 if else문을 최대한 안쓰고 만들어 봤습니다.

5번부터는 3중 이상 포문과 if, else를 쓰고 시간을 단축시켜 구현할 수 있었지만 

코딩테스트도 연습할겸 2중 포문을 쓰고 최대한 코딩길이도 줄이는 방법을 택했습니다.

 

2중 포문을 사용하는 수많은 방법 중 내 머리를 쥐어짜 최대한 짤 수 있는만큼 짜봤습니다...

이번 교육때 배운 연산자중에 삼항연산자를 쓰게 되었고 조건문 수식에 대한 여러 방법들을 알게 되었습니다. 

 

아직 시간복잡도의 개념을 확실하게 알진 못하지만 별찍기를 바탕으로 실력을 늘릴 수 있게 하려고 합니다. ㅎㅎ

 

		// 1번 
		for(int i = 0;i<3;i++) { // i = 행 i가 증가함에 따라 행 증가
			for(int j=0;j<4;j++) { // j = 열( * 출력)
				System.out.print('*'); //j값이 증가함에 따라 열에 *출력
			}

			System.out.println();
		}

		// 2번
		for(int i = 1;i<=3;i++) { // i = 행 i가 증가함에 따라 행 증가
			for(int j=1;j<=i;j++) { // i가 증가함에 따라 *의 출력도 같이 됨.   
				System.out.print('*');
			}
			System.out.println();
		}

		// 3번 3중 포문
		for(int i = 1;i<=3;i++) { // i = 행, i가 증가함에 따라 행 증가
			for(int j=i;j<3;j++) { // j = 열, i = 1일때 공백은 2개 출력됨 
				// j의 초기값은 i의 회전마다 변해야 공백이 감소되므로 i를 대입
				System.out.print(' ');
			}
			for(int k=0;k<i;k++) { 
				// 변수를 하나 더 써서 k반복문에 공백 다음 *을 출력
				// k는 i의 회전수 마다 *을 출력하게 되므로 최대값을 i와 맞춤
				System.out.print('*');
			}
			System.out.println();
		}

		// 4번 3중 포문
		for(int i = 0;i<=2;i++) { // 최대 행은 3 
			for(int j=i;j<2;j++) { // 공백을 먼저 출력하기 위해 3번과 같이 조건을 맞춤
				System.out.print(' ');
			}
			for(int k=2-i;k<=2+i;k++) { 
				// 기준 열 감소(최소)와 기준 열 증가(최대)를 해서 *의 출력을 늘림
				System.out.print('*');
			}
			System.out.println();
		}
		// 4번 2중 포문
		for(int i=0;i<3;i++) { // 최대 행은 3 
			for(int j=0;j<=2+i;j++) { // i가 증가함에 따라 출력열 j 최대값이 증가
				System.out.print((j+i<2)? ' ' : '*');
				// 삼항연산자를 이용해 참이면 j의 최대 회전수 만큼 공백을 먼저출력
				// 거짓이면 *을 출력하게 조건문 설정

			}
			System.out.println();
		}


		// 5번 for 2개로 해보기
		for(int i=0,d=0;i<5;i++) { // i = 최대 행 (전체 회전 수 : 5줄) 
			// d = 스위치 조건문 변화를 주기위한 변수
			// int d = 0;
			for(int j=0;j<3+d;j++) { 
				// i = 0일때 '' '' '*' 3번의 출력을 시작해야함으로 회전수는 3으로 조건문 설정
				// d라는 스위치 변수를 설정해 최대 회전수 5와 스위치 조건문을 통해 다시 3으로 감소할 수 있는 장치
				// i = 2일때 j 회전에서 최대 수 5번 출력을하고
				// i = 3일때 j 회전 수 4로 감소함  
				System.out.print((j<2-d)? ' ' : '*');
				// 삼항 연산자를 통해 i의 줄 마다 ' '과 *을 출력하도록 작성
			}
			if(i<2) { // 스위치 조건문 i가 3이 될때 j의 회전 수 4로 감소시키기 위한 장치
				d++; // i<2를 만족시킬 시 다이아몬드 모양이 맞춰지게 d를 증가시켜 j의 회전수를 조정
			}
			else {
				d--;// i<2 i가 2를 넘어갈 시 다이아몬드 모양이 맞춰지게 d를 감소시켜 i=3부터 j의 회전수를 조정
			}
			System.out.println(); // 다음 행
		}
		//i  j          j+d d
		//0  0 1 2       3  0
		//1  0 1 2 3     4  1
		//2  0 1 2 3 4   5  2
		//3  0 1 2 3     4  1
		//4  0 1 2       3  0
        
        // 6번 입력받기 for 2개와 삼항연산자 그리고 조건문
		int num;
		Scanner sc = new Scanner(System.in);
		System.out.print("출력할 다이아몬드 높이 입력(홀수만) : ");
		num = sc.nextInt();

		for(int i=0,d=0;i<num;i++) { // num = 최대 출력 회전 수 (전체 회전 수 : num값)
			// d = 스위치 조건문 변화를 주기위한 변수
			// int d=0;을 여기다 선언하면 d의 값은 계속 0으로 초기화 돼서 제값을 출력못함.
			for(int j=0;j<(num/2)+1+d;j++) { 
				// 출력되는 공백과 '*'이 감소되는 최대 회전 수 
				System.out.print((j<(num/2)-d)? ' ' : '*');
				// j가 증가함에 따라 열에 나타내는 문자를 출력 
			}
			if(i<(num/2)) { // 현재 회전 수와 열의 개수가 증가에서 감소되는 반환점을 비교
				d++; // 조건이 참이면 최대 출력 문자를 나타낼 스위치 변수의 값 증가
			}
			else {
				d--; // 조건이 거짓이면 최대 출력 문자를 나타낼 스위치 변수의 값 감소

			}
			System.out.println();
		}

 

주석 없는 코드

		// 1번 
		for(int i = 0;i<3;i++) { 
			for(int j=0;j<4;j++) { 
				System.out.print('*'); 
			}

			System.out.println();
		}

		// 2번
		for(int i = 1;i<=3;i++) {
			for(int j=1;j<=i;j++) {  
				System.out.print('*');
			}
			System.out.println();
		}

		// 3번 3중 포문
		for(int i = 1;i<=3;i++) {
			for(int j=i;j<3;j++) {
				System.out.print(' ');
			}
			for(int k=0;k<i;k++) { 

				System.out.print('*');
			}
			System.out.println();
		}

		// 4번 3중 포문
		for(int i = 0;i<=2;i++) {
			for(int j=i;j<2;j++) { 
				System.out.print(' ');
			}
			for(int k=2-i;k<=2+i;k++) { 
				System.out.print('*');
			}
			System.out.println();
		}

		// 4번 2중 포문
		for(int i=0;i<3;i++) {
			for(int j=0;j<=2+i;j++) {
				System.out.print((j+i<2)? ' ' : '*');
			}
			System.out.println();
		}


		// 5번 for 2개로 해보기
		for(int i=0,d=0;i<5;i++) {  
			for(int j=0;j<3+d;j++) { 
				System.out.print((j<2-d)? ' ' : '*');
			}
			if(i<2) {
				d++; 
			}
			else {
				d--;
			}
			System.out.println(); 
		}

		// 6번 for 2개와 삼항연산자 그리고 조건문
		int num;
		Scanner sc = new Scanner(System.in);
		System.out.print("출력할 다이아몬드 높이 입력(홀수만) : ");
		num = sc.nextInt();

		for(int i=0,d=0;i<num;i++) { 
			for(int j=0;j<(num/2)+1+d;j++) { 
				System.out.print((j<(num/2)-d)? ' ' : '*');
			}
			if(i<(num/2)) { 
				d++; 
			}
			else {
				d--; 
			}
			System.out.println();
		}
반응형

댓글