| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- 프론트엔드 비대면반
- 백준
- LG유플러스 유레카 프론트엔드 개발자
- LG유플러스 유레카 프론트엔드
- 정렬
- 코딩
- 웹시큐리티
- 소수
- 스레드
- Java
- 시간 복잡도
- 브루트포스
- 멀티캠퍼스IT부트캠프
- git branch 협업
- 유레카 부트캠프
- 알고리즘
- 부트캠프후기
- 멀티캠퍼스IT부트캠프티
- 프론트엔드
- 애자일
- 프로세스
- Do it! 자료구조와 함께 배우는 알고리즘 입문
- 재귀
- LG유플러스 유레카 부트캠프
- 자바
- LG유플러스 유레카 3기 프론트엔드
- 2775번 문제
- tanstack query
- 별찍기10
- zod
- Today
- Total
개발 일기
백준 2447번 문제풀이 - 별찍기 - 10 본문

https://www.acmicpc.net/problem/2447
2447번: 별 찍기 - 10
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이
www.acmicpc.net
재귀로 같은 패턴의 별찍기를 하게 되는 문제이다. 처음에 어떤 패턴이 반복되는지는 이해가 같지만 어떻게 코딩으로 구현해야될지는 감이 잡히지 않아서 다른 사람의 풀이도 보면서 문제를 혼자 풀게되는데는 3일이 걸린 것 같다.
코딩
public class Star10 {
static char[][] star;
static void stamp(char[][] star, int x, int y, int N) {
// 별을 찍게 됨
if (N == 1) {
star[x][y] = '*';
}
// 별을 찍게 되는 경우마다 호출
if (N > 1) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (!(i == 1 && j == 1)) {
stamp(star, x + i * (N / 3), y + j * (N / 3), N / 3);
}
}
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
star = new char[n][n];
for (int i = 0; i < n; i++) { // 전체 배열을 공백으로 초기화
for (int j = 0; j < n; j++) {
star[i][j] = ' ';
}
}
// 별찍는 메서드
stamp(star, 0, 0, n);
// 별 출력
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
sb.append(star[i][j]);
}
sb.append('\n');
}
System.out.println(sb);
}
}
별을 찍게 되는 경우의 for문을 살펴보면
배열의 행열에서 0부터 3의 배수로 증가하며 호출되는 것을 볼 수 있다.
i와 j가 1일 경우는 공백이기 때문에 그 외에 호출 되도록하여 *을 찍게 된다.
N = 3일 경우
N / 3 = 1이 되면서 *이 찍히게 되는데
(0,0) -> (0, 1) -> (0, 2) -> (1, 0) -> (1, 1)찍히지 않음 -> (1, 2) -> (2, 0) -> (2, 1) -> (2, 2) 순으로 찍히게 된다.
N = 9일 경우
N / 3 = 3이 되면서 위와 같은 과정이 호출되며 반복된다.
결과

시간 초과가 나게된 것은 StringBuilder를 사용하지 않았을 때이고 StringBuilder를 출력할 때 사용하여 맞을 수 있었다.
느낀 점
재귀를 이해하려고 여러 문제를 접하고 있지만 설명을 하려고 글을 쓰다보면 부족한 부분이 많다는 것을 느낀다. 설명에 자신이 없고 다른 문제에 잘 적용하여 풀 수 있을지 의문이 들기 때문이다. 결국 많이 풀어보는 수 밖에 없는 것 같다.
'백준 문제풀이' 카테고리의 다른 글
| 백준 7568번 문제풀이 - 덩치 (0) | 2021.12.06 |
|---|---|
| 백준 2231번 문제풀이 - 분해합 (0) | 2021.12.02 |
| 백준 11729번 문제풀이 - 하노이 탑 이동 순서 (0) | 2021.11.30 |
| 백준 1018번 문제풀이 - 체스판 다시 칠하기 (0) | 2021.11.29 |
| 백준 2798번 문제풀이 - 블랙잭 (0) | 2021.11.29 |