알고리즘 문제풀이/백준

#2447 : 별 찍기 - 10

모항 2022. 5. 18. 02:44

풀이방법

사용된 것:

분할 정복

재귀

 

2022.05.18

분할 정복 문제이고, 재귀적으로 정의된 함수를 사용한다.

 

사용된 전역변수는 

char[][] print : 출력할 별 그림

이렇게 하나이다.

 

사용된 함수 star()의 구조를 간단히 설명하자면 다음과 같다.

 

함수 star()

개요

star()은 특정 영역에 대하여,

영역의 한 변의 길이가 3이라면 해당 영역에 3x3짜리 별 그림을 직접 찍고,

영역의 한 변의 길이가 3보다 크다면 재귀를 수행하는 함수이다.

 

매개변수

  • int row : star()에서 다룰 영역의 시작부분(가장 왼쪽 위 지점)의 열 좌표
  • int col : star()에서 다룰 영역의 시작부분(가장 왼쪽 위 지점)의 행 좌표
  • int len : star()에서 다룰 영역의 한 변의 길이

 

작동방식

len이 몇인지부터 확인한다.

 

len이 3이라면 주어진 영역의 값을 다음과 같이 바꾼다:

주어진 영역의 1행: 별, 별, 별

주어진 영역의 2행: 별, 공백, 별

주어진 영역의 3행: 별, 별, 별

 

len이 3보다 크다면 다음과 같이 한다:

주어진 영역을 다음과 같이 (len/3)x(len/3)크기의 부분 영역 9개로 쪼개서

가운데 영역은 공백으로 채우고, 나머지 영역에 대해서는 재귀를 한다.

재귀 재귀 재귀
재귀 공백으로 채우기 재귀
재귀 재귀 재귀

 

코드

Java(2022.05.18)

import java.util.Scanner;

public class Main {
	
	static char[][] print;	//화면에 출력할 별들
	
	public static void star(int row, int col, int len) {
		
		//base case
		if(len == 3) {
			//첫째줄 (별 별 별)
			print[row][col] = '*';
			print[row][col+1] = '*';
			print[row][col+2] = '*';
			//둘째줄 (별 공백 별)
			print[row+1][col] = '*';
			print[row+1][col+1] = ' ';
			print[row+1][col+2] = '*';
			//셋째줄 (별 별 별)
			print[row+2][col] = '*';
			print[row+2][col+1] = '*';
			print[row+2][col+2] = '*';
		}
		
		//나머지 case
		else {
			int next = len/3;
			
			//첫째줄 (재귀 재귀 재귀)
			star(row, col, next);
			star(row, col+next, next);
			star(row, col+next+next, next);
			
			//둘째줄 (재귀 공백 재귀)
			star(row+next, col, next);
			for(int i = row+next; i<row+next+next; i++) {
				for(int j = col+next; j<col+next+next; j++) {
					print[i][j] = ' ';
				}
			}
			star(row+next, col+next+next, next);			
			
			//셋째줄 (재귀 재귀 재귀)
			star(row+next+next, col, next);
			star(row+next+next, col+next, next);
			star(row+next+next, col+next+next, next);
		}
		
		return;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		//N의 값 읽어오기
		int n = sc.nextInt();
		//별 그림 배열 생성
		print = new char[n][n];
		//별 그림 그리기
		star(0, 0, n);
		//별 그림 출력
		StringBuilder sb = new StringBuilder();
		
		for(int i = 0; i<n; i++) {
			for(int j = 0; j<n; j++) sb.append(print[i][j]);
			sb.append(System.lineSeparator());
		}
		
		System.out.print(sb);
		
		sc.close();
	}

}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

#4779 : 칸토어 집합  (0) 2022.05.20
#3009 : 네 번째 점  (0) 2022.05.20
#2630 : 색종이 만들기  (0) 2022.05.18
#1269 : 대칭 차집합  (0) 2022.05.16
#2851 : 슈퍼 마리오  (0) 2022.05.12