www.acmicpc.net/problem/10992

 

10992번: 별 찍기 - 17

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

www.acmicpc.net

문제

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력

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

예제 입력 1

1

예제 출력 1

*

예제 입력 2

2

예제 출력 2

 *

***

예제 입력 3

3

예제 출력 3

  *

 * *

*****

예제 입력 4

4

예제 출력 4

   *

  * *

 * * *

******

 

 

 

 

풀이 .

import java.util.*;
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));
        StringBuilder sb = new StringBuilder();

        int n = Integer.parseInt(br.readLine());
        int[] starArr = new int[n + 1];
        int[] spaceArr = new int[n + 1];
        int cnt = 3;
        for(int i = 2; i <= n; i++) {
            starArr[i] = cnt;
            spaceArr[i] = cnt - 2;
            cnt += 2;
        }

        // 첫번째 줄
        for(int i = 1; i <= n - 1; i++) sb.append(" ");
        sb.append("*\n");
        // (2 ~ n-1)번째 줄
        for(int i = 2; i <= n - 1; i++) {
            // 먼저 공백 쭉
            for(int j = n - i; j >= 1; j--) sb.append(" ");
            // "* 공백 쭉 *"
            sb.append("*");
            for(int j = 1; j <= spaceArr[i]; j++) sb.append(" ");
            sb.append("*\n");
        }
        // n번째 줄
        for(int i = 1; i <= starArr[n]; i++) sb.append("*");

        bw.write(sb.toString());
        br.close();
        bw.flush();
        bw.close();
    }
}

 

예시들을 보고 반복문의 역할을 어떻게 나눌 것인지가 중요

 

세 개의 큰 반복문으로 나누었다.

 

1. 첫번째 줄을 찍는 반복문

2. 2~n-1번째 줄을 찍는 반복문

3. n번째 줄을 찍는 반복문

 

n이 1, 2일 때는 별 사이에 연속적인 공백이 들어가는 줄이 없다.

그래서 두 특수케이스 n=1일때 3으로만 처리, n=2일때 1, 3으로만 처리하도록 하고 나머지는 1, 2, 3으로 해결하도록 했다.

 

2~n-1번째 줄들에서 별 사이에 들어가는 공백의 수는 1부터 시작해 2개씩 늘어나는 규칙을 이용했다.

+ Recent posts