백준에서 여러 별찍기 문제를 찾아 볼 수 있는데, 이는 for문을 어느정도 이해하고 있어야 풀 수 있는 문제로, 별찍다가 진짜 별을 볼 뻔해서 이참에 연습을 해보고자 한다.
출력만 신경써서 오답이 많을 수 있다. 더 나은점이 있다면 꼭 댓글로 알려주세요!
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print("*");
}
System.out.println();
}
for (int i = 0; i < n; i++) {
for (int j = 0; j <=i; j++) {
System.out.print("*");
}
System.out.println();
}
int n = Integer.parseInt(br.readLine());
for (int k = 0; k < n; k++) {
for (int i = 0; i < k; i++) {
System.out.print(" ");
}
for (int j = n; j > k; j-- ) {
System.out.print("*");
}
System.out.println();
}
먼저 공백이 0개 ~ 4개까지 쌓이는 for문이 앞단에 위치하며,
그 후 별을 n-k만큼 반복해서 찍는 코드이다.
int n = Integer.parseInt(br.readLine());
// 5회 반복하기 위한 반복문
for (int i = 0; i < n; i++) {
for(int j = 0; j < n - i - 1; j++) {
System.out.print(" ");
}
for(int j = 0; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
// 5회 반복하기 위한 반복문
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
// 반대로 줄어드는 트리를 그리기 위한 반복문
for (int i = 0; i < n-1; i++) {
for (int j = n-1; j > i; j--) {
System.out.print("*");
}
System.out.println();
}
// 5회 반복하기 위한 반복문
for (int i = 0; i < n; i++) {
for (int j = n; j > i; j--) {
System.out.print("*");
}
System.out.println();
}
// 반대로 다시 늘어나는 트리를 그리기 위한 반복문
for (int i = 2; i < n+1; i++) {
for (int j = 0; j < i; j++) {
System.out.print("*");
}
System.out.println();
}
늘어나는 별트리 코드부터는, 이미 내려올 때 1개가 찍힌 상태이므로 2개부터 찍힐 수 있게 i = 2를 한 것이며, n+1을 함으로써 4번을 반복할 수 있도록 구성
// 5회 반복하기 위한 반복문
for (int k = 1; k < n+1; k++) {
for (int i = n; i > k; i--) {
System.out.print(" ");
}
for (int j = 0; j < k; j++) {
System.out.print("*");
}
System.out.println();
}
// 반대로 다시 줄어드는 트리를 그리기 위한 반복문
for (int k = 1; k <= n; k++) {
for (int i = 0; i < k; i++) {
System.out.print(" ");
}
for (int j = n; j > k; j--) {
System.out.print("*");
}
System.out.println();
}
여기서는 공백이 우선적으로 들어가야 하기 때문에 공백을 위한 for문이 한개 더 늘어난 것을 볼 수 있다.
// 5번 반복을 위한 반복문
for (int l = 1; l < 2 *n; l+=2) {
// 좌측 공백 생성
for(int i = 2* n-1; i > l; i-=2) {
System.out.print(" ");
}
// 별 생성
for(int j = 0; j <l; j++) {
System.out.print("*");
}
System.out.println();
}
먼저 2씩 증가하는 등차의 모습을 보인다. 그러기 때문에 2개씩 증가할 수 있도록
int l을 n까지가 아닌 2*10까지 하여 2씩 증가하는데 부족하지 않도록 한 후
공백 역시 2씩 적어져야 하므로 i-=2로 2씩 감소하도록 코드를 작성하였다.
for (int i = 1; i < 2 * n; i+=2) {
for (int j = 1; j < i; j+=2) {
System.out.print(" ");
}
for (int j = 10; j > i; j--) {
System.out.print("*");
}
System.out.println();
}
문제푼다고 좀 머리 아팠다.. 필자는 수학과 거리가 많이 멀다...
여기서 관건은 공백을 0, 1, 2, 3, 4만큼 만들 수 있냐와
공간을 별이 찍힌만큼 있다고 생각하는 것이 아닌, 마지막 별이 찍히는곳이 끝나는 지점이라는 생각을 해야한다.
필자는 자꾸 공간이 2n-1만큼 있다고 생각하니.. 문제 이해를 못했다.
혹시 저와 같은 생각을 하시는 분이 계셨다면, 마지막 별이 끝나는 지점이
끝점 (혹은 옆에 벽이 있다고 생각)이라고 생각을 하면 좀 더 문제 풀기가 쉬울것이다.
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
// 피라미드
for (int i = 1; i < 2 * n; i+=2) {
for (int j = 2 * n-1; j > i; j-=2) {
System.out.print(" ");
}
for (int j = 0; j < i; j++) {
System.out.print("*");
}
System.out.println();
}
// 역 피라미드
for (int i = 2 * n -2; i > 0; i-=2) {
// 공백찍기
for (int j = 2 * n ; j > i; j-=2) {
System.out.print(" ");
}
// 별찍기
for (int j = 1; j < i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
이 친구 풀어보려고 지금까지 별찍기를 연습해보았다..
앞으로 또 나올 별찍기에 대해서 이번에 배웠던 로직들을 잘 이용해 다시 블로그에 적도록 하겠다.