-내 생각
일반적인 별 찍기 문제와는 다른 문제였다. 우선 처음 봤을 때, 주어진 n에 따라 행의 개수가 정해진다는 사실은 알 수 있었는데, 열의 개수를 알 수가 없어서 알아내는 과정이 필요했다. 우선 n이 1인 경우는 1개만 출력하는 것을 정해놓고, 2일 때 열의 개수가 3개, 3일 때 열의 개수가 5개, 4일 때 열의 개수가 7개.... 식으로 간다는 것을 보면, 열의 개수 변화는 1 -> 3 -> 5 -> 7...로 변화하는데, 단순히 2개씩 증가한다는 것을 알 수도 있지만 n의 값에 따라 열의 개수가 정해져야 하므로 n과 함께 고려해보면 2*n -1개의 열이 생성되는 것이다.
이제 열의 개수를 알았으니 규칙을 찾아야 하는데, 예제 출력을 노트에 그려보면, 각 n번 째 자리에 하나를 찍고 출발을 하며, 두 번째 행부터는 별을 찍으면 다음은 찍지 않고 다음은 찍고를 알 수 있다. 그렇다면 우선 별의 공백을 고려하지 않고 모두 찍은 후 해당 사항에서만 공백을 출력해준다면 된다고 생각했다.
-해법
우선 공백을 고려하지 않고 별을 찍기 위해서는 이전에 풀었던 별 찍기 문제들 처럼 특정 범위에서만 별을 찍게 만들었는데, 그 범위는 위에서 언급했듯이 첫 번째 줄은 n번 째 열에서 한 개를 찍고 그다음은 n을 기준으로 +-1, +-2, +-3... 식으로 가기 때문에 행을 증가 반복문으로 두고 범위를 정해주면 된다. 즉 1부터 n까지 증가하는 행을 반복으로 돌면서 n+-행 값을 통해 범위를 구할 수 있다.
for(int i=1;i<=n;i++) { // 1 ~ n까지 반복
for(int j=1;j<2*n;j++) { // 열의 개수
if(j==n+i) break; // 마지막 별을 찍은 다음 반복문은 벗어난다.
if(j>n-i && j<n+i) { // 별이 찍히는 범위
// n이 2일 경우 1번 행의 범위는 1<j<3
// 2번 행의 범위는 0<j<4가 된다.
이렇게 별을 모두 찍었다면 이제 공백을 고려해주어야 하는데, 앞서 언급했듯이 두 번째 줄부터 별이 찍히고, 찍히지 않고를 반복하기 때문에 flag변수를 하나두어서 구분해주면 된다.
int flag=0; //별을 찍을 지 여부를 구분하는 flag변수, 0일 경우 찍을 수 있고 1일 경우 찍을 수 없다.
for(int i=1;i<=n;i++) {
flag=0; // 각 행의 시작은 무조건 별을 찍어야 하기 때문에 매 행마다 0으로 초기화 해준다.
for(int j=1;j<2*n;j++) {
if(j==n+i) break;
if(j>n-i && j<n+i) {
if(flag == 0) { // 범위 안의 j에서 flag가 0일 경우 찍을 수 있다.
System.out.print("*");
flag =1; // 찍었으므로 flag값을 1로 변경해준다.
}
else { // 범위 안의 j에서 flag가 1일 경우 찍을 수 업다.
System.out.print(" ");
flag=0; // 찍지 않았으므로 flag값을 0으로 변경해준다.
}
}else
System.out.print(" ");
}
System.out.println();
}
이렇게 코드를 완성할 수 있다.