곽로그

[백준 2444, JAVA] 별 찍기 -7 본문

알고리즘/백준

[백준 2444, JAVA] 별 찍기 -7

일도이동 2023. 3. 21. 23:13
반응형

문제

https://www.acmicpc.net/problem/2444

 

2444번: 별 찍기 - 7

첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.

www.acmicpc.net

 

해결

규칙만 찾으면 정말 쉽게 풀 수 있다. 그러기 위해서 필자는 표를 사용했다. 

n= 5일 때

라인번호
(i)
                  공백
개수
별표
개수
1         *         4
= 5-1
1
=2*1 -1
2       * * *       3
=5-2
3
=2*2 -1
3     * * * * *     2
=5-3
5
=2*3 -1
4   * * * * * * *   1
=5-4
7
=2*4 -1
5 * * * * * * * * * 0
=5-5
9
=2*5 -1
6   * * * * * * *   1
=6-5
7
=2*4-1
7     * * * * *     2
=7-5
5
=2*3-1
8       * * *       3
=8-5
3
=2*2-1
9         *         4
=9-5
1
=2*1-1

크게 3가지의 반복이 있다. 첫번째는 공백과 별표를 찍어주는 한 라인의 반복, 한 라인안에서 공백의 반복, 한 라인안에서 별표의 반복이다

먼저 한 라인의 반복을 보자. n=5일 때, 라인은 2*5-1, 즉 2*n-1번 반복한다.

 

그 다음 한 라인 안에서의 반복을 봐야하는데, 여기서 주의해야할 점은, 정방향 삼각형과 역방향 삼각형의 경계다. 다시말해 라인번호 i 가 n보다 작거나 같을 때와 i가 n보다 클때의 공백개수와 별표개수의 규칙이 다르다.

 

정방향에서 공백의 반복은 n-i 만큼, 별표의 반복은 2*i -1 만큼 반복이 된다. 역방향에서의 규칙이 조금 헷갈릴 수 있는데 역방향의 규칙은 정방향에서의 규칙에서 힌트를 얻을 수 있다. 

 

 공백의 개수는 n과 라인번호 (i) 의 계산으로 얻을 수 있었다.  i=6일 때, 공백의 개수는 1이고, n=5이다. 그럼 여기서 수식을 만들 수 있는데, 공백의 개수 = 라인번호 - n이 된다.

 

 마찬지로 역방향일 때의 별표개수를 보자. i=6일 때, 별표의 개수는 7이고, n=5이다 여기서 정방향일 때 의 별표개수는 2*라인번호 -1 이었는데, 7 = 2*(4) -1 에서 4를 i(6)와 n(5)의 조합으로 만들어 보자. 2*(5-1) -1 을 처음에 생각했었다. 그럼 여기서 5-1의 1은 라인번호 - n 으로 만들 수 있다. 즉 2*(n -(i-n)) -1 = 2*(2n-i) -1 

 

이제 위의 반복을 코드로 구현하면 된다. 

 

코드 

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int N = Integer.parseInt(br.readLine());

        StringBuffer result = new StringBuffer();

        // 한 개의 라인을 만들기 위한 반복문
        for(int i = 1; i<=2*N-1 ; i++){
            StringBuilder line = new StringBuilder();

            //정방향 삼각형
            if(i<=N){
                for(int j = 1; j<=N-i; j++){
                    line.append(" ");
                }
                for(int j =1; j<=2*i-1;j++){
                    line.append("*");
                }
            }
            //역방향 삼각형
            else{
                for(int j = 1; j<=i-N;j++){
                    line.append(" ");
                }
                for(int j = 1; j<=2*(2*N-i)-1;j++){
                    line.append("*");
                }
            }
            result.append(line).append("\n");
        }

        bw.write(result.toString());
        bw.flush();

    }
}

 

반응형
Comments