문제
2444번: 별 찍기 - 7
첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.
www.acmicpc.net
*
***
*****
*******
*********
*******
*****
***
*
풀이
별 찍기는 어려운 문제는 아닌데 공백과 별이 찍히는 횟수를 일반화하는 과정이 생각을 많이 요해서 풀기 귀찮은 문제이다.
그래서 항상 풀기 싫어했는데 그 감정을 극복하기 위해.. 이번 문제를 통해 풀이 방법을 체화하고 넘어가려고 한다. 이번에는 경우의 수를 많이 나눠야 해서 알고리즘 설계 시 바로 IDE에 작성하지 않고 손코딩을 했다.
먼저 별 갯수가 점점 늘어나는 부분(위), 줄어드는 부분(아래)를 따로 for문으로 구현하기로 한다.
N을 입력받았을 때, 위: N줄, 아래: N-1줄을 출력해야 하므로 각 for문 안에 쓰일 조건문은 완성되었다.
N=3일때 위쪽 for문의 각 줄이 출력하는 것
i | 공백 | 별 |
0 | 2 | 1 |
1 | 1 | 3 |
2 | 0 | 5 |
일반화 : | N-1-i | 2i+1 |
N=3일때 아래쪽 for문의 각 줄이 출력하는 것
i | 공백 | 별 |
0 | 1 | 3 |
1 | 2 | 1 |
일반화 : | i+1 | 2(N-i)-3 |
위쪽 for문 : 공백과 별이 각각 N-1-i번, 2i+1번 반복출력되고 개행문자가 더해진다. -> N번 반복
아래쪽 for문 : 공백과 별이 각각 i+1번, 2(N-i)-3번 반복출력되고 개행문자가 더해진다. -> N-1번 반복
코드
import java.util.*;
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());
for(int i=0; i<N; i++) {
for(int p=0; p<N-1-i; p++) {
bw.write(" ");
}
for(int q=0; q<2*i+1; q++) {
bw.write("*");
}
bw.write("\n");
}
for(int i=0; i<N-1; i++) {
for(int p=0; p<i+1; p++) {
bw.write(" ");
}
for(int q=0; q<2*(N-i)-3; q++) {
bw.write("*");
}
bw.write("\n");
}
bw.close();
}
}
Note
일반화하는 팁
- 홀수를 구하고싶으면 2x-1을 적용해본다
- i와 반비례이면 i를 빼본다
- 만든 일반식에 숫자를 직접 대입하여 확인해본다
'BOJ' 카테고리의 다른 글
[백준 1157번/JAVA] 단어 공부 (0) | 2024.03.11 |
---|---|
[백준 10988번/JAVA] 팰린드롬인지 확인하기 (0) | 2024.03.11 |
[백준 2908/JAVA] 상수 | StringBuffer와 StringBuilder의 차이 (0) | 2024.03.09 |
[백준 1152/JAVA] 단어의 개수 (0) | 2024.03.08 |
[백준 2675번/JAVA] 문자열 반복 (0) | 2024.03.08 |