오류, 기능, 문제해결(JAVA)

자바 별찍기

seungmin576 2024. 12. 10. 18:23

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

 

처음 해봤을때

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줄까지는 어떻게 되는지 실행문을 작성한다.