자바 백준 2447번
골드 5
https://www.acmicpc.net/problem/2447
문제 보기
분류: 분할 정복, 재귀
문제 풀기
덩어리 패턴을 보면 가운데는 별을 출력하지 않기때문에 이 부분을 빼고 3 by 3 형태에서 9구획으로 나눈 8개 부분만 재귀를 사용한다.
이 나눈 구획은 마지막인 size 1을 제외하고 항상 3의 제곱수를 갖는다. 따라서 매번 재귀 함수에 진입할때마다 3으로 나눈 newSize로 패턴을 형성한다. 8구획 모두 지속적으로 적용하는 방법으로 패턴을 그린다.
코드 보기
import java.util.Scanner;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
printPattern(N);
}
public static void printPattern(int N) {
// 패턴을 담을 Array 생성
char[][] pattern = new char[N][N];
// Array에 공백으로 모두 채워 초기화
for (char[] row : pattern) {
Arrays.fill(row, ' ');
}
// 패턴 메서드 실생
drawPattern(pattern, 0, 0, N);
// pattern 저장된 Array 출력
for (char[] row : pattern) {
System.out.println(row);
}
}
// 패턴을 그리는 재귀적 메서드
public static void drawPattern(char[][] pattern, int row, int col, int size) {
if (size == 1) {
// base case
// 재귀의 마지막단인 size가 1이면 "*"로 채움
pattern[row][col] = '*';
} else {
// recursive case
// 재귀적으로 패턴 지정
int newSize = size / 3;
// 왼쪽 상단
drawPattern(pattern, row, col, newSize);
// 가운데 상단
drawPattern(pattern, row, col + newSize, newSize);
// 오르쪽 상단
drawPattern(pattern, row, col + newSize * 2, newSize);
// 왼쪽 중간
drawPattern(pattern, row + newSize, col, newSize);
// 오른쪽 중간
drawPattern(pattern, row + newSize, col + newSize * 2, newSize);
// 왼쪽 하단
drawPattern(pattern, row + newSize * 2, col, newSize);
// 가운데 하단
drawPattern(pattern, row + newSize * 2, col + newSize, newSize);
// 오른쪽 하단
drawPattern(pattern, row + newSize * 2, col + newSize * 2, newSize);
}
}
}
추가 하기
재귀 함수 확인을 위한 테스트 출력 코드 적용
N = 3 일때,
더보기
- 결과
***
* *
***
import java.util.Scanner;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
printPattern(N);
}
public static void printPattern(int N) {
// 패턴을 담을 Array 생성
char[][] pattern = new char[N][N];
// Array에 공백으로 모두 채워 초기화
for (char[] row : pattern) {
Arrays.fill(row, ' ');
}
// 패턴 메서드 실생
drawPattern(pattern, 0, 0, N);
// pattern 저장된 Array 출력
for (char[] row : pattern) {
System.out.println(row);
}
}
// 패턴을 그리는 재귀적 메서드
public static void drawPattern(char[][] pattern, int row, int col, int size) {
if (size == 1) {
// 재귀의 마지막단인 size가 1이면 "*"로 채움
pattern[row][col] = '*';
} else {
// 재귀적으로 패턴 지정
int newSize = size / 3;
// 왼쪽 상단
drawPattern(pattern, row, col, newSize);
// 가운데 상단
drawPattern(pattern, row, col + newSize, newSize);
// 오르쪽 상단
drawPattern(pattern, row, col + newSize * 2, newSize);
// 왼쪽 중간
drawPattern(pattern, row + newSize, col, newSize);
// 오른쪽 중간
drawPattern(pattern, row + newSize, col + newSize * 2, newSize);
// 왼쪽 하단
drawPattern(pattern, row + newSize * 2, col, newSize);
// 가운데 하단
drawPattern(pattern, row + newSize * 2, col + newSize, newSize);
// 오른쪽 하단
drawPattern(pattern, row + newSize * 2, col + newSize * 2, newSize);
}
for (char[] r : pattern) {
System.out.println(r);
}
System.out.println();
System.out.println("=".repeat(size));
System.out.println();
}
}
/*
// N = 3 일때
*
=
**
=
***
=
***
*
=
***
* *
=
***
* *
*
=
***
* *
**
=
***
* *
***
=
***
* *
***
===
***
* *
***
*/
N = 9 일때,
더보기
- 결과
*********
* ** ** *
*********
*** ***
* * * *
*** ***
*********
* ** ** *
*********
import java.util.Scanner;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
printPattern(N);
}
public static void printPattern(int N) {
// 패턴을 담을 Array 생성
char[][] pattern = new char[N][N];
// Array에 공백으로 모두 채워 초기화
for (char[] row : pattern) {
Arrays.fill(row, ' ');
}
// 패턴 메서드 실생
drawPattern(pattern, 0, 0, N);
// pattern 저장된 Array 출력
for (char[] row : pattern) {
System.out.println(row);
}
}
// 패턴을 그리는 재귀적 메서드
public static void drawPattern(char[][] pattern, int row, int col, int size) {
if (size == 1) {
// 재귀의 마지막단인 size가 1이면 "*"로 채움
pattern[row][col] = '*';
} else {
// 재귀적으로 패턴 지정
int newSize = size / 3;
// 왼쪽 상단
drawPattern(pattern, row, col, newSize);
// 가운데 상단
drawPattern(pattern, row, col + newSize, newSize);
// 오르쪽 상단
drawPattern(pattern, row, col + newSize * 2, newSize);
// 왼쪽 중간
drawPattern(pattern, row + newSize, col, newSize);
// 오른쪽 중간
drawPattern(pattern, row + newSize, col + newSize * 2, newSize);
// 왼쪽 하단
drawPattern(pattern, row + newSize * 2, col, newSize);
// 가운데 하단
drawPattern(pattern, row + newSize * 2, col + newSize, newSize);
// 오른쪽 하단
drawPattern(pattern, row + newSize * 2, col + newSize * 2, newSize);
}
for (char[] r : pattern) {
System.out.println(r);
}
System.out.println();
System.out.println("=".repeat(size));
System.out.println();
}
}
/*
// N = 9 일때
*
=
**
=
***
=
***
*
=
***
* *
=
***
* *
*
=
***
* *
**
=
***
* *
***
=
***
* *
***
===
****
* *
***
=
*****
* *
***
=
******
* *
***
=
******
* **
***
=
******
* ** *
***
=
******
* ** *
****
=
******
* ** *
*****
=
******
* ** *
******
=
******
* ** *
******
===
*******
* ** *
******
=
********
* ** *
******
=
*********
* ** *
******
=
*********
* ** **
******
=
*********
* ** ** *
******
=
*********
* ** ** *
*******
=
*********
* ** ** *
********
=
*********
* ** ** *
*********
=
*********
* ** ** *
*********
===
*********
* ** ** *
*********
*
=
*********
* ** ** *
*********
**
=
*********
* ** ** *
*********
***
=
*********
* ** ** *
*********
***
*
=
*********
* ** ** *
*********
***
* *
=
*********
* ** ** *
*********
***
* *
*
=
*********
* ** ** *
*********
***
* *
**
=
*********
* ** ** *
*********
***
* *
***
=
*********
* ** ** *
*********
***
* *
***
===
*********
* ** ** *
*********
*** *
* *
***
=
*********
* ** ** *
*********
*** **
* *
***
=
*********
* ** ** *
*********
*** ***
* *
***
=
*********
* ** ** *
*********
*** ***
* * *
***
=
*********
* ** ** *
*********
*** ***
* * * *
***
=
*********
* ** ** *
*********
*** ***
* * * *
*** *
=
*********
* ** ** *
*********
*** ***
* * * *
*** **
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
===
*********
* ** ** *
*********
*** ***
* * * *
*** ***
*
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
**
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
***
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
***
*
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
***
* *
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
***
* *
*
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
***
* *
**
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
***
* *
***
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
***
* *
***
===
*********
* ** ** *
*********
*** ***
* * * *
*** ***
****
* *
***
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
*****
* *
***
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
******
* *
***
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
******
* **
***
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
******
* ** *
***
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
******
* ** *
****
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
******
* ** *
*****
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
******
* ** *
******
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
******
* ** *
******
===
*********
* ** ** *
*********
*** ***
* * * *
*** ***
*******
* ** *
******
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
********
* ** *
******
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
*********
* ** *
******
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
*********
* ** **
******
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
*********
* ** ** *
******
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
*********
* ** ** *
*******
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
*********
* ** ** *
********
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
*********
* ** ** *
*********
=
*********
* ** ** *
*********
*** ***
* * * *
*** ***
*********
* ** ** *
*********
===
*********
* ** ** *
*********
*** ***
* * * *
*** ***
*********
* ** ** *
*********
=========
*********
* ** ** *
*********
*** ***
* * * *
*** ***
*********
* ** ** *
*********
*/
'공부하기 > 백준' 카테고리의 다른 글
[Java] 백준 풀기 15596 - 정수 N개의 합 (0) | 2023.07.10 |
---|---|
[Java] 백준 풀기 10951 - A+B 4 (0) | 2023.07.09 |
[Java] 백준 풀기 2446 - 별 찍기 9 (0) | 2023.07.07 |
[Java] 백준 풀기 2445 - 별 찍기 8 (0) | 2023.07.06 |
[Java] 백준 풀기 2444 - 별 찍기 7 (0) | 2023.07.05 |