728x90
문제 링크
https://www.acmicpc.net/problem/2447
풀이 과정
별 모양으로 채운 2차원 배열에서 시작해 현재 사각형의 9등분에서 가운데 부분을 빈칸으로 바꾸는 식으로 문제를 해결했다.
eraseStar의 매개변수 중 row, col은 도형의 시작점이고, temp라는 변수를 이용해 9등분을 구현했다.
for문을 이용해 eraseStar를 9번 재귀 호출했다.
중간에 빈칸으로 채워지는 부분까지 호출되는데, 어차피 빈칸이므로 정답에 지장은 없다.
코드
import java.util.*;
import java.io.*;
class Main {
static void eraseStar(char[][] arr, int row, int col, int size) {
int temp = size / 3;
for(int i = 0; i < temp; i++) {
for(int j = 0; j < temp; j++) {
arr[row + temp + i][col + temp + j] = ' ';
}
}
if(temp > 1) {
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
eraseStar(arr, row + i * temp, col + j * temp, temp);
}
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
char[][] stars = new char[n][];
for(int i = 0; i < n; i++) {
stars[i] = new char[n];
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
stars[i][j] = '*';
}
}
eraseStar(stars, 0, 0, n);
StringBuilder sb = new StringBuilder();
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
sb.append(stars[i][j]);
}
sb.append("\n");
}
System.out.println(sb);
}
}
느낀 점
재귀를 이렇게도 사용할 수 있구나를 느꼈다.
내 풀이처럼 배열에서 구역을 나눠 가운데 부분을 빈칸 처리할 수도 있고, 아래 풀이처럼 현재 좌표에서 어떤 문자를 출력하는지 알아내는 방식도 기억하면 좋을 것 같아 아래에 남겨두려고 한다.
import java.util.*;
import java.io.*;
class Main {
static char getStar(int i, int j, int size) {
int newSize = size / 3;
// 빈칸을 출력하는 가운데 공간에 i, j가 있으면 빈칸 리턴
if(i / newSize == 1 && j / newSize == 1) return ' ';
// 위에서 리턴되지 않은 경우 중 현재 사이즈가 3인 경우 * 리턴
if(size == 3) return '*';
// i와 j의 좌표를 변경하여 재귀 호출
// 3등분한 사이즈로 나눈 나머지: 탐색 범위를 9등분한 칸으로 좁히는 효과
return getStar(i % newSize, j % newSize, newSize);
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
sb.append(getStar(i, j, n));
}
sb.append("\n");
}
System.out.println(sb);
}
}
728x90
'알고리즘 & 백준 문제풀이 메모' 카테고리의 다른 글
[알고리즘] 이진 탐색 (0) | 2024.08.11 |
---|---|
[알고리즘] 백트래킹 (0) | 2024.08.03 |
[백준] 9663번: N-Queen (0) | 2024.08.03 |
[백준] 24511번: queuestack (0) | 2024.07.30 |
[백준] 12789번: 도키도키 간식드리미 (0) | 2024.07.27 |