기본 중에 기본이지만 처음에 하면 무척 까다로운 문제. 별 찍기.
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개의 (노가다)별찍기를 정리해봤다. 물론 저 위의 있는 답 말고도 여러 가지 방식으로 답을 찾을 수 있다. 하지만 보편적인 방식이라는 점을 알아두었으면 좋겠다. 뭐가 좋고 나쁘고를 떠나서 남들이 보기에도 충분히 이해할 수 있는 코드가 현업에서도 먹힌다는 얘기를 들었다. 최대한 코드를 깔끔하게 타인도 다 같이 이해하기 쉽게 작성하는 연습이 필요하다.
내가 여태까지 썼던 블로그 중 가장 긴 글이 아닐까 싶다. 이 문제를 다 풀어서 알긴 하지만 블로그에 한번 더 작성하면서 복습을 하게 된다. 누군가가 그랬다. 코딩을 잘한다는 것은 그 코드를 정확하게 이해하는 것뿐만 아니라 다른 사람들한테도 설명할 수 있어야 한다고. 아직은 코린이.. 내가 이런 말을 인용할 자격이나 될지는 모르겠지만 그래도 배워가는 입장에서 노력하는 수밖에...
'개발 > 자바' 카테고리의 다른 글
자바 {맥북} 내가 자주 사용하는 이클립스 단축키 정리. (0) | 2021.01.17 |
---|---|
자바 if문과 switch문을 비교해보자. (0) | 2021.01.17 |
자바 문자열에 특정문자 개수 구하기 / 영문자만 입력받기 (ASCII 코드활용) / 스캐너에서 char값 입력받기 (charAt()) (0) | 2021.01.16 |
자바 반복문 예제들 (최소공배수, 최대공약수, 1~n 사이의 소수 구하기) (0) | 2021.01.14 |
자바 반복문 (for문 / while문 / do-while문), 구구단 표현하기. (0) | 2021.01.14 |
댓글