곽로그
[백준 2444, JAVA] 별 찍기 -7 본문
문제
https://www.acmicpc.net/problem/2444
해결
규칙만 찾으면 정말 쉽게 풀 수 있다. 그러기 위해서 필자는 표를 사용했다.
n= 5일 때
라인번호 (i) |
공백 개수 |
별표 개수 |
|||||||||
1 | * | 4 = 5-1 |
1 =2*1 -1 |
||||||||
2 | * | * | * | 3 =5-2 |
3 =2*2 -1 |
||||||
3 | * | * | * | * | * | 2 =5-3 |
5 =2*3 -1 |
||||
4 | * | * | * | * | * | * | * | 1 =5-4 |
7 =2*4 -1 |
||
5 | * | * | * | * | * | * | * | * | * | 0 =5-5 |
9 =2*5 -1 |
6 | * | * | * | * | * | * | * | 1 =6-5 |
7 =2*4-1 |
||
7 | * | * | * | * | * | 2 =7-5 |
5 =2*3-1 |
||||
8 | * | * | * | 3 =8-5 |
3 =2*2-1 |
||||||
9 | * | 4 =9-5 |
1 =2*1-1 |
크게 3가지의 반복이 있다. 첫번째는 공백과 별표를 찍어주는 한 라인의 반복, 한 라인안에서 공백의 반복, 한 라인안에서 별표의 반복이다
먼저 한 라인의 반복을 보자. n=5일 때, 라인은 2*5-1, 즉 2*n-1번 반복한다.
그 다음 한 라인 안에서의 반복을 봐야하는데, 여기서 주의해야할 점은, 정방향 삼각형과 역방향 삼각형의 경계다. 다시말해 라인번호 i 가 n보다 작거나 같을 때와 i가 n보다 클때의 공백개수와 별표개수의 규칙이 다르다.
정방향에서 공백의 반복은 n-i 만큼, 별표의 반복은 2*i -1 만큼 반복이 된다. 역방향에서의 규칙이 조금 헷갈릴 수 있는데 역방향의 규칙은 정방향에서의 규칙에서 힌트를 얻을 수 있다.
공백의 개수는 n과 라인번호 (i) 의 계산으로 얻을 수 있었다. i=6일 때, 공백의 개수는 1이고, n=5이다. 그럼 여기서 수식을 만들 수 있는데, 공백의 개수 = 라인번호 - n이 된다.
마찬지로 역방향일 때의 별표개수를 보자. i=6일 때, 별표의 개수는 7이고, n=5이다 여기서 정방향일 때 의 별표개수는 2*라인번호 -1 이었는데, 7 = 2*(4) -1 에서 4를 i(6)와 n(5)의 조합으로 만들어 보자. 2*(5-1) -1 을 처음에 생각했었다. 그럼 여기서 5-1의 1은 라인번호 - n 으로 만들 수 있다. 즉 2*(n -(i-n)) -1 = 2*(2n-i) -1
이제 위의 반복을 코드로 구현하면 된다.
코드
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
StringBuffer result = new StringBuffer();
// 한 개의 라인을 만들기 위한 반복문
for(int i = 1; i<=2*N-1 ; i++){
StringBuilder line = new StringBuilder();
//정방향 삼각형
if(i<=N){
for(int j = 1; j<=N-i; j++){
line.append(" ");
}
for(int j =1; j<=2*i-1;j++){
line.append("*");
}
}
//역방향 삼각형
else{
for(int j = 1; j<=i-N;j++){
line.append(" ");
}
for(int j = 1; j<=2*(2*N-i)-1;j++){
line.append("*");
}
}
result.append(line).append("\n");
}
bw.write(result.toString());
bw.flush();
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준10988, JAVA ]팰린드롬인지 확인하기 (0) | 2023.05.07 |
---|---|
[백준 25083, JAVA] 새싹 ( java escape 문자) (0) | 2023.03.19 |
[백준 10811, JAVA] 바구니 뒤집기 (0) | 2023.03.12 |
[백준 2460 | java, python] 주사위 세개 (0) | 2022.04.22 |
[백준 2525, python] 오븐 시계 (0) | 2022.04.14 |