별을 찍는데 아래 모양과 갯수대로 찍어보자.

처음 해봤을때
public class ForExample {
public static void main(String[] args) {
String star = "*";
String space = " ";
for(int i = 1; i <= 4; i++){
for(int j = 1; j <= 7; j++){
System.out.print(space);
if(i == 1 && j == 4) {
System.out.print(star);
} else if (i == 2 && j >= 3) {
for(; j <= 5; j++) {
System.out.print(star);
}
} else if (i == 3 && j >= 2){
for(; j <= 6; j++){
System.out.print(star);
}
} else if(i == 4 && j >= 1){
for(; j <= 7; j++)
System.out.print(star);
}
}
System.out.println();
}
}
}

답을 안보고 혼자서 풀었더니 가독성 개구린 코드로 짜게 됐다.
위 코드의 해설은 아래 가독성 개편 코드의 주석을 보면된다.
가독성 개편
public class ForExample {
public static void main(String[] args) {
int starCount = 1;
int lineCount = 4;
int spaceCount = 3;
for(int i = 1; i <= lineCount; i++){
for(int k = 1; k <= spaceCount; k++){
System.out.print(" ");
}
for(int j = 1; j <= starCount; j++){
System.out.print("*");
}
starCount += 2;
spaceCount -= 1;
System.out.println();
}
// String star = "*";
// String space = " ";
// for(int i = 1; i <= 4; i++){ //4의 의미는 총 별이 4줄이라
// for(int j = 1; j <= 7; j++){ // 7의 의미는 별이 마지막에 찍히는게 7개라
// System.out.print(space);
// if(i == 1 && j == 4) { //첫번째 줄이면서 공백을 4번 찍었을때(4번째 칸에서)
// System.out.print(star); //별 하나
// } else if (i == 2 && j >= 3) { //두번째 줄이면서 공백을 3개 찍었을때(3번째 칸에서)
// for(; j <= 5; j++) { //5번째칸까지
// System.out.print(star); //별찍어줘
// }
// } else if (i == 3 && j >= 2){ //세번째 줄이면서 공백을 2개 찍었을때(2번째 칸에서)
// for(; j <= 6; j++){ //6번째 칸까지
// System.out.print(star); //별찍어줘
// }
// } else if(i == 4 && j >= 1){ //네번째 줄이면서 공백을 1개 찍었을때(1번째 칸에서)
// for(; j <= 7; j++) //7번째 칸까지
// System.out.print(star); //별찍어줘
// }
// }
// System.out.println(); // 한줄 작성하면 다음 줄로 넘어가줘
// }
}
}

일단 처음에 했을땐 for 반복문 안에 i가 4줄 동안 반복하면
중첩 반복문 안에 k가 별 7개 반복하게 하느라 안에 미친 중첩 반복문이 됐다는 걸 깨닫고
줄 = lineCount
별 = starCount
띄어쓰기 = spaceCount로 위에 따로 빼서 작성을 하기 시작함.
따로 빼고 나니 중첩문 안 조건이 뭔지 영어단어로 보여서 좀 더 명확하고, 마지막에 따로 별갯수, 공백을 조절하니 코드 자체가 간결해졌다.
문제해결자체는 처음처럼해도 가능하지만 되도록 가독성이 좋은 방향으로 작성할 수 있다면 그렇게 하도록 노력하자

위 그림 모양과 갯수대로 찍어보자
처음 쓴거
public class ForExample {
public static void main(String[] args) {
int starCount = 1;
int lineCount = 4;
int spaceCount = 3;
for(int i = 1; i <= lineCount; i++){
for(int k = 1; k <= spaceCount; k++){
System.out.print(" ");
}
for(int j = 1; j <= starCount; j++){
System.out.print("*");
}
starCount += 2;
spaceCount -= 1;
if(i >= 4 && i <= 7){
lineCount++;
starCount -= 4;
spaceCount += 2;
}
System.out.println();
}

마지막에 if문을 추가하여 해결했다. if문 안의 실행문 해석들
lineCount++ : if문의 조건을 보면 (i >= 4 && i <= 7)인데 이 의미는 '4줄부터 7줄동안' 이라는 의미이니 lineCount++을 하게 되면 7줄까지만 늘어난다.
starCount -=4 : 반복문에서 별을 2개씩 늘렸으니 4개씩 줄게하면 결과적으로 2개씩 줄어드는 셈이다.
spaceCount +=2 : 위와 비슷한 이유로 공백을 1개씩 줄였으니 2개씩 늘리면 결과적으로 1개씩 늘어나는 셈이다.
if문 수정
public class ForExample {
public static void main(String[] args) {
int starCount = 1;
int lineCount = 7;
int spaceCount = 3;
for(int i = 1; i <= lineCount; i++){
for(int k = 1; k <= spaceCount; k++){
System.out.print(" ");
}
for(int j = 1; j <= starCount; j++){
System.out.print("*");
}
if(i < 4) {
starCount += 2;
spaceCount -= 1;
}
else {
starCount -= 2;
spaceCount += 1;
}
System.out.println();
}

if else로 나눠서 나름 가독성 높힌다고 높혀봤다.
이 경우엔 lineCount를 처음부터 7로 초기화해서 7줄로 작성을 해놓고 만약 4줄까지는 이라는 조건과 else로 5줄부터 7줄까지는 어떻게 되는지 실행문을 작성한다.
'오류, 기능, 문제해결(JAVA)' 카테고리의 다른 글
| static 문제 연습 중에 (0) | 2024.12.16 |
|---|---|
| 한 파일에 클래스가 두 개 존재 할 때 (0) | 2024.12.16 |
| for문 실행순서, 그리고 그 때문에 생긴 while과 결과 차이 (0) | 2024.12.10 |
| for, while반복문 실행과정(참고용) (0) | 2024.12.10 |
| unreachable statement (1) | 2024.12.10 |