[백준]13015번: 별 찍기 - 23(Java)

ywwwon01·2022년 8월 12일
0

알고리즘

목록 보기
10/13

문제

🔗 13015번: 별 찍기 - 23

첫 번째 시도(Semantic error)

code

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int n = Integer.parseInt(br.readLine());
        int i, j;

        for (i = 1; i <= 2 * n - 1; i++) { // 첫 번째 줄, 두 번째 줄 ...
            if (i == 1 || i == (n + (n - 1))) { // 첫 번째 줄과 마지막 줄, 즉 천장과 바닥
                for (j = 1; j <= n; j++) {
                    bw.write("*");
                }
                for (j = 1; j <= (n - 1) + (n - 2); j++) { // 테두리 바깥 공백
                    bw.write(" ");
                }
                for (j = 1; j <= n; j++) {
                    bw.write("*");
                }
            }
            else { // 그 외, 기둥을 만드는 부분
                if (i < n) {
                    for (j = 1; j <= i - 1; j++) {
                        bw.write(" ");
                    }
                    bw.write("*");
                    for (j = 1; j <= n - 2; j++) {
                        bw.write(" ");
                    }
                    bw.write("*");
                    for (j = 1; j <= (n - 1) + (n - 2) - 2 * (i - 1); j++) { // 테두리 바깥 공백
                        bw.write(" ");
                    }
                    bw.write("*");
                    for (j = 1; j <= n - 2; j++) {
                        bw.write(" ");
                    }
                    bw.write("*");
                }
                if (i > n) {
                    for (j = 1; j <= n - (i % n) - 1; j++) {
                        bw.write(" ");
                    }
                    bw.write("*");
                    for (j = 1; j <= n - 2; j++) {
                        bw.write(" ");
                    }
                    bw.write("*");
                    for (j = 1; j <= 2 * (i % n) - 1; j++) { // 테두리 바깥 공백
                        bw.write(" ");
                    }
                    bw.write("*");
                    for (j = 1; j <= n - 2; j++) {
                        bw.write(" ");
                    }
                    bw.write("*");
                }
                else {
                    for (j = 1; j <= i - 1; j++) {
                        bw.write(" ");
                    }
                    bw.write("*");
                    for (j = 1; j <= n - 2; j++) {
                        bw.write(" ");
                    }
                    bw.write("*");
                    for (j = 1; j <= n - 2; j++) {
                        bw.write(" ");
                    }
                    bw.write("*");
                }
            }
            bw.write("\n");
        }

        bw.flush();
    }
}

review

...

X 모양은 참 잘 보이는데

옆에 이상한 것도 참 잘 보이네요?

저기에 별이 왜 또 찍혔을까요..

그래서 이만큼 고쳐서 다시 시도해 보았습니다.

두 번째 시도

code

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int n = Integer.parseInt(br.readLine());
        int i, j;

        for (i = 1; i <= 2 * n - 1; i++) { // 첫 번째 줄, 두 번째 줄 ...
            if (i == 1 || i == (n + (n - 1))) { // 첫 번째 줄과 마지막 줄, 즉 천장과 바닥
                for (j = 1; j <= n; j++) {
                    bw.write("*");
                }
                for (j = 1; j <= (n - 1) + (n - 2); j++) { // 테두리 바깥 공백
                // 이런건 식 정리해서 (2 * n - 3) 이런식으로 써주면 깔끔하겠네요!
                    bw.write(" ");
                }
                for (j = 1; j <= n; j++) {
                    bw.write("*");
                }
            }
            else { // 그 외, 기둥을 만드는 부분
                if (i < n) {
                    for (j = 1; j <= i - 1; j++) {
                        bw.write(" ");
                    }
                    bw.write("*");
                    for (j = 1; j <= n - 2; j++) {
                        bw.write(" ");
                    }
                    bw.write("*");
                    for (j = 1; j <= (n - 1) + (n - 2) - 2 * (i - 1); j++) { // 테두리 바깥 공백
                    // 조건식 정리하면 -> 2 * (n - i) - 1
                        bw.write(" ");
                    }
                    bw.write("*");
                    for (j = 1; j <= n - 2; j++) {
                        bw.write(" ");
                    }
                    bw.write("*");
                }
                if (i > n) {
                    for (j = 1; j <= n - (i % n) - 1; j++) {
                        bw.write(" ");
                    }
                    bw.write("*");
                    for (j = 1; j <= n - 2; j++) {
                        bw.write(" ");
                    }
                    bw.write("*");
                    for (j = 1; j <= 2 * (i % n) - 1; j++) { // 테두리 바깥 공백
                        bw.write(" ");
                    }
                    bw.write("*");
                    for (j = 1; j <= n - 2; j++) {
                        bw.write(" ");
                    }
                    bw.write("*");
                }
                else if (i == n) {
                    for (j = 1; j <= i - 1; j++) {
                        bw.write(" ");
                    }
                    bw.write("*");
                    for (j = 1; j <= n - 2; j++) {
                        bw.write(" ");
                    }
                    bw.write("*");
                    for (j = 1; j <= n - 2; j++) {
                        bw.write(" ");
                    }
                    bw.write("*");
                }
            }
            bw.write("\n");
        }

        bw.flush();
    }
}

review

성공하였습니다!

if else문에서 else로만 떼우려고 했더니..

다른 부분에서도 해당 조건에 걸려 이상한 부분에 까지 별을 찍어버린 모양입니다..

코드가 조금 복잡해 보입니다만..

(외면..)

참!!

이제부터 코드에 짧게 주석을 추가해서

제가 풀이한 논리의 아이디어를 표현할 수 있도록 해보려고 합니다!

이 글을 찾아오신 분들께 도움이 되셨으면 좋겠습니다..

이상입니다.

profile
생각의 전개를 공유합니다.

0개의 댓글