본문 바로가기
👋국비 후기 모음👋 (이력도 확인 가능!)
개발/자바

자바 별찍기 - 무서워하지 말자. 차근차근 이해해보자

by 킴뎁 2021. 1. 17.
728x90
반응형

기본 중에 기본이지만 처음에 하면 무척 까다로운 문제. 별 찍기.

Q.1,2,3

public class star {
	public static void main(String[] args) {
    
    //Q.1
		for(int i=0; i<5; i++) {
			System.out.print("*");
		}
        
    //Q.2
		for(int i=0; i<5; i++) {
			System.out.println("*");
		}
        
    //Q.3
    	for(int i=0; i<5; i++) {
			for(int j=0; j<5; j++) {
				System.out.print("*");
			}
			System.out.println();
		}
	}
}

1, 2, 3은 너무 기본이라 넘어가고


Q.4

11111
22222
33333
44444
55555

public class Q_04 {
	public static void main(String[] args) {
    
		for(int i=1; i<=5; i++) {
			for(int j=0; j<5; j++) {
				System.out.print(i);
			}
			System.out.println();
		}
	}
}

3번을 참고하여 문제를 풀어보자.

  • Line 10 - 세로줄을 나타내는 반복문이다. 5줄이 있으니 i가 1~5까지 총 5번을 반복.
  • Line 11 - 가로줄을 나타내는 반복문이다. i번째 세로줄일 때 iiiii가 출력된다.
    • 순서
    • i = 1이고 j = 0~4까지 총 5번 1을 반복 출력한다. 11111 // (System.out.print(1) x5
    • Line 14 - 한 줄 띄워준다.
    • i = 2이고 j = 0~4까지 총 5번 2를 출력한다. 22222 // System.out.print(2) x5
    • Line 14 - 한 줄 띄워준다.
    • ...
    • ...

Q.5

12345
12345
12345
12345
12345

public class Q_05 {
	public static void main(String[] args) {
		
		for(int i=0; i<5; i++) { 
			for(int j=1; j<=5; j++) { 
				System.out.print(j); 
			}
			System.out.println(); 
		}
		
	}
}

 

  • Line 10 - 세로줄은 총 5줄. i가 0~4 총 5번 반복하면서 한 줄씩 내려간다.
  • Line 11 - j가 1~5까지 반복하면서 j값을 출력한다. jjjjj -> 12345

Q.6

12345
23456
34567
45678
56789

public class Q_06 {
	public static void main(String[] args) {
		
		for(int i=0; i<5; i++) { 
			for(int j=1; j<=5; j++) { 
				System.out.print(i+j); 
			}
			System.out.println(); 
		}
		
	}
}

Q.4,5를 참고하여 문제를 풀어보자.

  • Line 10 - 세로줄은 0~4까지 총 5번 반복한다.
    • i = 0이고 j가 1,2,3,4,5 반복할 때 12345 출력 // System.out.print(j)
    • i = 1이고 j가 1,2,3,4,5 반복할 때 23456 출력 // System.out.print(j+1)
    • i = 2이고 j가 1,2,3,4,5 반복할 때 34567 출력 // System.out.print(j+2)
    • i = 3이고 j가 1,2,3,4,5 반복할 때 45678 출력 // System.out.print(j+3)
    • ...
    • ...
    • 즉, 각 줄마다 (j+i)를 출력한다

Q.7

56789
45678
34567
23456
12345

public class Q_07 {
	public static void main(String[] args) {
		
		for(int i=0; i<5; i++) { 10
			for(int j=5; j<10; j++) { 11
 				System.out.print(j-i); 12
			}
			System.out.println(); 14
		}
		
	}
}

Q.6을 참고하여 문제를 풀어야 한다. 생각을 조금 더 해야 하는 문제. (수업시간에 이 부분에서 막힌 사람이 꽤 보였다.)

  • Line 10 - 항상 5줄이므로 코드 동일
  • Line 11 - j도 똑같이 5번을 반복하지만 시작 값을 5로 조금 달리해야 한다. 점점 줄어드는 방식.
    • i = 0이고 j가 5,6,7,8,9 총 5번 반복할 때, 56789 출력 // System.out.print(j)
    • i = 1이고 j가 5,6,7,8,9 총 5번 반복할 때, 45678 출력 // System.out.print(j-1)
    • i = 2이고 j가 5,6,7,8,9 총 5번 반복할 때, 34567 출력 // System.out.print(j-2)
    • ...
    • ...
    • 즉, 각 줄마다 (j-i)를 출력한다

Q.8 - 본격 별 찍기 시작

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

public class Q_08 {
	public static void main(String[] args) {
		
		for(int i=0; i<5; i++) {
			for(int j=0; j<i+1; j++) {
				System.out.print("*");
			}
			System.out.println();
		}
		
	}
}

본격 별찍기 시작이다. 1~7까지 순서대로 차근차근 잘 이해하면서 풀었으면 충분히 풀 수 있는 문제다.

  • Line 10 - 세로줄은 5줄이니 여전히 코드 동일
  • i = 0일 때 j는 1번 반복한다. (별 하나)
  • i = 1일 때 j는 2번 반복한다. (별 두 개)
  • i =2일 때 j는 3번 반복한다. (별 세 개)
  • i = i일 때 j는 i+1번 반복한다.
  • Line 11 - 그러므로 j는 0부터 i번까지 반복한다.

Q.9

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

public class Q_09 {
	public static void main(String[] args) {
		
		for(int i=0; i<5; i++) {
			for(int j=0; j<5-i; j++) {
				System.out.print("*");
			}
			System.out.println();
		}
		
	}
}

Q.8에서 확인한 바 j의 반복 횟수에 따라 별의 개수가 정해진다.

  • j의 반복 횟수(별의 개수)를 i가 하나씩 늘어남에 따라 줄어들어야 한다.
  • i = 0일 때, j는 5번 반복
  • i = 1일 때, j는 4번(5-1) 반복
  • i = 2일 때, j는 3번(5-2) 반복
  • ...
  • i = i일 때, j는 (5-i) 반복

Q.10 - 여기서부턴 조금 복잡해진다.

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

public class Q_10 {
	public static void main(String[] args) {
		
		for(int i=0; i<5; i++) { 10
			for(int j=0; j<i; j++) {	//공백을 담당하는 for문
				System.out.print(" ");
			}
			for(int j=0; j<5-i; j++) {	//별을 담당하는 for문
				System.out.print("*"); 
			}
			System.out.println();
		}
	}
}

역삼각형을 만들어야 하는데 보기보다 어렵다. 뭔가 함정이랄까? 저 공백을 어떻게 표현할까 생각을 해야 한다.

  • 두 번째 줄부터 공백이 하나씩 늘어가는 모습. Q.8과 반복 횟수만 다를 뿐 동일하다.
    • Line 11 : i = 0 일 때, j는 0개의 공백 ( 0번 반복 )
    •              i = 1 일 때, j는 1개의 공백 ( 1번 반복 )
    •              ...
    •              i = i 일 때, j는 i개의 공백. ( i번 반복 )
    • 그러므로 Line 11의 for문은 j가 0 ~ (i-1)까지 i번 반복해준다.
  • 별을 담당하는 for문은 잘 보면 별이 하나씩 줄어드는 모습이다.
  • 공백 for문이 없다고 생각하면 정확하게 Q.9와 동일한 로직이다.
    • 순서
    • i = 0일 때, 공백 0개 별 5개 출력 후 Line 17 한 줄 띄우기 실행.
    • i = 1일 때, 공백 1개 별 4개 출력 후 Line 17 한 줄 띄우기 실행.
    • ...
    • i = i일 때, 공백 i개 별 5-i개 출력 후 Line 17 실행.

Q.11

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

public class Q_11 {
	public static void main(String[] args) {
    
		for(int i=0; i<5; i++) {
			for(int j=0; j<4-i; j++) {	//공백을 담당하는 for문
				System.out.print(" ");
			}
			for(int j=0; j<i+1; j++) {	//별을 담당하는 for문
				System.out.print("*");
			}
			System.out.println();
		}
	}
}

여기까지 해왔으면 이 문제는 너무 쉬운 문제다.

공백을 담당하는 for문은 Q.9와 반복 횟수만 하나 줄여주면 되고

별을 담당하는 for문은 점점 별이 하나씩 증가하는 반복문이므로 Q.8과 정확히 동일한 반복문이다.


Q.12

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

public class Q_12 {
	public static void main(String[] args) {
		
		for(int i=0; i<5; i++) {		//1~5번째 줄을 담당하는 for문
			for(int j=0; j<i+1; j++) {
				System.out.print("*");
			}
			System.out.println();
		}
		for(int i=0; i<4; i++) {		//6~9번째 줄을 담당하는 for문
			for(int j=0; j<4-i; j++) {
				System.out.print("*");
			}
			System.out.println();
		}
		
	}
}

이 문제는 파트를 두 개로 나눠야 한다. 위쪽 삼각형을 만드는 for문,  아래쪽 삼각형을 만드는 for문.

1~5번째 줄을 담당하는 for문은 Q.8과 정확히 일치..!!

6~9번째 줄을 담당하는 for문은 Q.11의 공백을 담당하는 for문이랑 정확히 일치한다. 공백을 별로 바꾸어 주면 된다.


Q.13

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

public class Q_13 {
	public static void main(String[] args) {
		
		for(int i=0; i<5; i++) {		//1~5번째 줄을 담당하는 for문
			for(int j=0; j<5-i; j++) {
				System.out.print("*");
			}
			System.out.println();
		}
		for(int i=0; i<4; i++) {		//6~9번째 줄을 담당하는 for문
			for(int j=0; j<i+2; j++) {
				System.out.print("*");
			}
			System.out.println();
		}
	}
}

이 문제만 딱 봤을 땐 감이 안 잡힐 수도 있다. 실제로 나도 그러했다. 하지만 Q.1부터 차근차근 진행하다 보면 for문의 이해도가 높아지면서 자연스레 이 문제를 풀 수 있게 된다.

1~5번째 줄을 담당하는 for문은 Q.9와 동일.

6~9번째 줄을 담당하는 for문은 조금 더 많이 생각해보아야 한다.

i가 4번 반복하는 동안 별의 개수가 하나씩 늘어나지만 별의 개수가 2개부터 시작한다.

즉, i = 0일 때, j는 2번 반복을 시작으로 하나씩 늘어간다.

Line 21을 이해하기엔 충분할 거라 생각을 한다.


이렇게 총 13개의 (노가다)별찍기를 정리해봤다. 물론 저 위의 있는 답 말고도 여러 가지 방식으로 답을 찾을 수 있다. 하지만 보편적인 방식이라는 점을 알아두었으면 좋겠다. 뭐가 좋고 나쁘고를 떠나서 남들이 보기에도 충분히 이해할 수 있는 코드가 현업에서도 먹힌다는 얘기를 들었다. 최대한 코드를 깔끔하게 타인도 다 같이 이해하기 쉽게 작성하는 연습이 필요하다.

 

내가 여태까지 썼던 블로그 중 가장 긴 글이 아닐까 싶다. 이 문제를 다 풀어서 알긴 하지만 블로그에 한번 더 작성하면서 복습을 하게 된다. 누군가가 그랬다. 코딩을 잘한다는 것은 그 코드를 정확하게 이해하는 것뿐만 아니라 다른 사람들한테도 설명할 수 있어야 한다고. 아직은 코린이.. 내가 이런 말을 인용할 자격이나 될지는 모르겠지만 그래도 배워가는 입장에서 노력하는 수밖에...

 

kimdevel.tistory.com/40

 

자바 국비 7일차. for문의 기본 중 기본 별찍기!!

21.01.15.금 드디어 별찍기 문제를 내셨다. 뭔가 악몽이랄까...? 저번 모 학원에 무료특강 때 별찍기를 나갔었는데 멘붕의 연속이었다. 아주 기본적인 것도 못 짰었던.. 그로부터 두달정도가 지난

kimdevel.tistory.com

반응형
👋국비 후기 모음👋 (이력도 확인 가능!)

댓글