문제
N이 주어지면 양쪽에서 별이 늘어나다 가운데에서 만나고, 다시 줄어드는 패턴을 출력한다.
입력
첫째 줄에 N (1 ≤ N ≤ 100)이 주어진다.
출력
2*N-1줄에 걸쳐 별을 출력한다. i번째 줄은 왼쪽에 min(i, 2N-i)개의 별, 가운데 공백, 오른쪽에 같은 수의 별을 출력한다.
예제
| 입력 | 출력 |
|---|---|
5 | * * ** ** *** *** **** **** ********** **** **** *** *** ** ** * * |
풀이
윗부분(1N줄)과 아랫부분(N-11줄)으로 나누어 별 패턴을 출력한다.
- 윗부분: i행에서 왼쪽 별 i개, 가운데 공백 2*(N-i)개, 오른쪽 별 i개를 출력한다
- 아랫부분: i행에서 왼쪽 별 i개, 가운데 공백 2*(N-i)개, 오른쪽 별 i개를 출력한다 (i를 N-1에서 1까지 감소)
- StringBuilder로 모아 한 번에 출력한다
핵심 아이디어: 대칭 패턴이므로 상단 증가 부분과 하단 감소 부분을 별도 루프로 처리한다.
코드
package day649;
import java.io.*;
public class Day610BOJ2445별찍기8 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++)
sb.append("*");
for (int j = 1; j <= 2 * n - 2 * i; j++)
sb.append(" ");
for (int j = 1; j <= i; j++)
sb.append("*");
sb.append("\n");
}
for (int i = n - 1; i >= 1; i--) {
for (int j = 1; j <= i; j++)
sb.append("*");
for (int j = 1; j <= 2 * n - 2 * i; j++)
sb.append(" ");
for (int j = 1; j <= i; j++)
sb.append("*");
sb.append("\n");
}
System.out.print(sb);
}
}복잡도
- 시간: O(N^2)
- 공간: O(N^2)