백준 2448번 별찍기 JAVA
문제 접근 방법
최소 입력값에서 시작해서 규칙 찾기
첫째 줄에 N이 주어진다. N은 항상 3×2^k 수이다. (3, 6, 12, 24, 48, …) (k ≤ 10)
문제에서 입력값으로 주어지는 N은 삼각형의 높이를 의미한다. 고로 N == for문 반복 개수
입력이 12 일 경우 예제 출력
*
* *
*****
* *
* * * *
***** *****
* *
* * * *
***** *****
* * * *
* * * * * * * *
***** ***** ***** *****
예제 출력를 보면 최소 단위 삼각형이 보인다.
최소 단위 삼각형 <- N = 3일때
*
* *
*****
이제 N 값을 늘려가며 생각해보기
N = 6
*
* *
*****
* *
* * * *
***** *****
N=3일때의 삼각형이 우측과 위에 하나씩 더 생김, 자세히 보니 우측은 한칸 띄고 생김
N = 12
*
* *
*****
* *
* * * *
***** *****
* *
* * * *
***** *****
* * * *
* * * * * * * *
***** ***** ***** *****
N=6일때의 삼각형이 우측과 위에 하나씩 더 생김, 이제 어떻게 풀어야 할지 감이 조금 옴
N = 6
* // N=3일때, i[0] = " * "
* *
*****
* * //N=3일때의 그림을 2개 복사, i[3] = i[0]+" "+i[0]
* * * *
***** *****
이런식으로 이전 단계 다음 배열 인덱스에 이전 단계의 그림을 2개 복사
N = 6
* // N=3일때, 좌, 우 공백 3칸 추가
* *
*****
* * //N=3일때의 그림을 2개 복사
* * * *
***** *****
그리고 이전 단계의 그림에 좌, 우 공백 추가, 공백 개수는 이전 단계의 배열 길이 만큼
결론 : 이전 단계의 그림을 2개 복사하되 각 그림은 한칸의 공백을 갖음, 그리고 이전 단계의 그림에 복사하기 전 배열 길이만큼 좌, 우 공백 추가
//결과 코드
public class P2448 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
final int N = sc.nextInt();
List<String> p = new ArrayList<>(N);
//N이 3일때 세팅
p.add(" * ");
p.add(" * * ");
p.add("*****");
//N => 3*2^k, 3, 6, 12, 24, 48, ... 이니깐 k가 1번째, 2번째 를 나타냄
for(int k=1; 3 * (int)Math.pow(2, k) <= N; k++) { //6입력부터 루프 실행
setStar(p);
}
//출력
for(String s : p){
System.out.println(s);
}
}
private static void setStar(List<String> p){
StringBuilder s = new StringBuilder();
StringBuilder s2 = new StringBuilder();
int pSize = p.size();
for(int i=0; pSize>i; i++){
s.delete(0,s.length());
//전 단계의 그림을 아래 하나, 옆 하나 이렇게 총 2개 복사
s.append(p.get(i)); //전 단계의 그림
s.append(" "); //공백
s.append(p.get(i)); //전 단계의 그림
p.add(s.toString());
//전 단계 그림의 왼쪽, 오른쪽에 공백 추가
s2.delete(0,s.length());
for(int j=0; pSize>j; j++){
s2.append(" ");
}
p.set(i, s2.toString() + p.get(i) + s2.toString());
}
}
}
풀이 후 다른분들 코드 보니깐 정말 다양하게 풀었더군요.. ㅎㅎ; 제 풀이가 심플하게 풀린거 같아서 공유합니다.