관리 메뉴

NineTwo meet you

[백준] 10993 별 찍기 - 18 본문

프로그래밍 문제/백준

[백준] 10993 별 찍기 - 18

NineTwo 2020. 6. 26. 21:15
반응형

출처


문제

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

입력

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

출력

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

예제


풀이

index가 3부터 n이 될때까지 증가하며 index값이 짝수일때와 홀수일때 각각 하는일이 다르다.

 

​짝수일때 하는 일 // 역삼각형 만들기

 

우선 이전에 만든 삼각형모양의 도형이 존재한다. (파란 삼각형)

(짝수 그림 1)

더보기

 

짝수 그림 1

       

1. 이전 삼각형의 ArrayList.size()-1인덱스 값 양쪽에 *을 추가한다.

(짝수 그림 2)

더보기

 

짝수 그림 2

     

 2. 이전 삼각형 맨 뒤부터 *(count 개수만큼 빈칸)*을 추가하고 마지막 제일 아래에 꼭짓점이 되는 *을 추가한다.

(짝수 그림 3)

더보기

 

짝수 그림 3

       

3. 이전 삼각형을 *(count 개수만큼 빈칸)(원래 삼각형)(count 개수만큼 빈칸)*으로 교체한다.

(짝수 그림 4)

더보기
짝수 그림 4

       

4.맨 윗줄에 가득찬 *줄을 추가한다.

(짝수 그림 5)

더보기
짝수 그림 5

 

홀수 일때 하는 일 // 삼각형 만들기

우선 이전에 만든 삼각형모양의 도형이 존재한다. (파란 삼각형)

(홀수 그림 1)

더보기
홀수 그림 1

 

1. 이전 삼각형의 0인덱스 값 양쪽에 *을 추가한다.

(홀수 그림 2)

더보기
홀수 그림 2

 

2. 이전 삼각형을 *(count 개수만큼 빈칸)(원래 삼각형)(count 개수만큼 빈칸)*으로 교체한다.

(홀수 그림 3)

더보기
홀수 그림 3

       

3. 맨 아래 가득찬 *줄을 추가한다.

(홀수 그림 4)

더보기
홀수 그림 4

        ​

4. 이전 삼각형 앞에 *(count 개수만큼 빈칸)*을 추가하고 마지막 제일 위에 꼭짓점이 되는 *을 추가한다.

(홀수 그림 5)

더보기
홀수 그림 5

 

 

마지막으로 완성된 도형을 가운데 정렬로 만들기 위해 

짝수인 경우, al.size()-1부터 0으로 가면서 앞에 공백을 추가한다.

(짝수 그림 6)

더보기
짝수 그림 6

       

홀수인 경우, 0부터 al.size()-1으로 가면서 앞에 공백을 추가한다.

(홀수 그림 6)

더보기

홀수 그림 6

 

코드

 

import java.util.LinkedList;
import java.util.ArrayList;
import java.util.Scanner;
public class BOJ10993 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
ArrayList<String> al = new ArrayList<>();
if(n == 1) { // n이 1일때 예외적으로 처리
System.out.println("*");
}else if(n == 2) { // n이 2일때 예외적으로 처리
System.out.println("*****");
System.out.println(" ***");
System.out.println(" *");
}else if(n >= 3) {
al.add("*****");
al.add("***");
al.add("*");
for(int i = 3; i <= n; i++) {
if(i%2 == 0) { // 짝수일때 (짝수 그림1)
//중간 별양쪽추가 (짝수 그림2)
al.add(al.size()-1, "*"+al.remove(al.size()-1)+"*");
int index = al.size()-1;
//아래 역삼각형 1개 추가 (짝수 그림3)
int count = al.get(al.size()-1).length()-4;
String empty = "";
for(; count >= 1;) {
empty = "";
for(int j = 0; j < count; j++) {
empty += " ";
}
count-=2;
al.add("*"+empty+"*");
}
al.add("*");
//위에 역삼각형 2개 추가 (짝수 그림4)
count = (al.get(index).length()- al.get(index-1).length())/2;
empty = "";
for(int k = index-1; k >= 0; k--) {
empty = "";
for(int j = 0; j < count; j++) {
empty += " ";
}
al.add(k, "*"+empty+al.remove(k)+empty+"*");
count += 2;
}
//맨위 별줄 추가 (짝수 그림5)
count = al.get(0).length() + 2;
String star = "";
for(int j = 0; j < count; j++) {
star += "*";
}
al.add(0, star);
}else {// 홀수일때 (홀수 그림 1)
//중간에 별양쪽 추가 (홀수 그림 2)
al.add(0,"*"+al.remove(0)+"*");
//밑에 정삼각형 2개 추가 (홀수 그림 3)
int count = (al.get(0).length()- al.get(1).length())/2;
String empty = "";
for(int k = 1; k < al.size(); k++) {
empty = "";
for(int j = 0; j < count; j++) {
empty += " ";
}
al.add(k, "*"+empty+al.remove(k)+empty+"*");
count += 2;
}
//맨밑 별줄 추가 (홀수 그림 4)
count = al.get(al.size()-1).length() + 2;
String star = "";
for(int j = 0; j < count; j++) {
star += "*";
}
al.add(star);
//위에 삼각형 1개 추가 (홀수 그림 5)
count = al.get(0).length()-4;
for(;count >= 1;) {
empty = "";
for(int j = 0; j < count; j++) {
empty += " ";
}
count -= 2;
al.add(0, "*"+empty+"*");
}
al.add(0,"*");
}
}
// 최종적으로 삼각형의 앞에 존재하는 공백을 추가한다.
int count = 0;
String empty ="";
if(n%2 == 0) { // n이 짝수일때, (짝수 그림 6)
for(int j = 0; j < al.size(); j++) {
empty = "";
for(int k = 0; k < count; k++) {
empty += " ";
}
al.add(j, empty+al.remove(j));
count++;
}
}else { // // n이 홀수일때, (홀수 그림 6)
count = 0;
for(int j = al.size()-1; j >= 0; j--) {
empty = "";
for(int k = 0; k < count; k++) {
empty += " ";
}
al.add(j, empty+al.remove(j));
count++;
}
}
//결과 출력
for(int i = 0; i < al.size(); i++) {
System.out.println(al.get(i));
}
}
}
}
view raw BOJ10993.java hosted with ❤ by GitHub

 

반응형

'프로그래밍 문제 > 백준' 카테고리의 다른 글

[백준] 10995 별 찍기 - 20  (0) 2020.06.26
[백준] 10994 별 찍기 - 19  (0) 2020.06.26
[백준] 10992 별 찍기 - 17  (0) 2020.06.26
[백준] 10991 별 찍기 - 16  (0) 2020.06.26
[백준] 10990 별 찍기 - 15  (0) 2020.06.26
Comments