dev_beomgeun
꾸준하게 차근차근
dev_beomgeun
전체 방문자
오늘
어제
  • 분류 전체보기 (170)
    • 전공 (0)
      • 운영체제 (0)
      • 알고리즘 (0)
      • 자료구조 (0)
      • 데이터베이스 (0)
      • 네트워크 (0)
    • 개발 공부 (32)
      • 웹 (6)
      • 리눅스 (4)
      • 머신러닝 (1)
      • 스프링 (17)
      • Git (2)
      • AWS (2)
    • 개발 도서, 강의 (3)
      • 스프링 입문을 위한 자바 객체지향의 원리와 이해 (0)
      • 모든 개발자를 위한 HTTP 웹 기본 지식(김영한.. (2)
      • 스프링 부트와 AWS로 혼자 구현하는 웹서비스 (1)
    • 문제 풀이 (118)
      • 백준 알고리즘 (72)
      • 프로그래머스 알고리즘, SQL (38)
      • Hackerrank SQL (8)
    • 프로젝트 기록 (4)
      • 캡스톤 종합설계 (4)
      • 반려하루 프로젝트 (0)
    • 활동 기록 (12)
      • 네이버 부스트캠프 (7)
      • 취준 & 코테 (4)
      • 소프트웨어 마에스트로 13기 (1)
    • 이것저것 (1)

블로그 메뉴

  • 홈
  • 깃허브
  • 링크드인
  • 방명록

공지사항

인기 글

태그

  • 프로그래머스
  • 백준
  • 서블릿
  • dp
  • 스프링
  • 반성
  • 네이버 부스트캠프
  • Baekjoon
  • 백준 DP
  • BFS
  • c++
  • HackerRank mysql
  • 부스트캠프
  • 프로그래머스 SQL
  • 기록
  • 그래프탐색
  • Hackerrank
  • 회고
  • AI Tech
  • 일기

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
dev_beomgeun

꾸준하게 차근차근

[baekjoon 2447] 별 찍기 - 10 (재귀 호출) (C++)
문제 풀이/백준 알고리즘

[baekjoon 2447] 별 찍기 - 10 (재귀 호출) (C++)

2021. 2. 9. 18:43
728x90

www.acmicpc.net/problem/2447

 

2447번: 별 찍기 - 10

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이

www.acmicpc.net

재귀를 이용해서 별 찍기 문제이다.

그림처럼 사이즈가 3일 때는 가운데만 뚫려있고, 나머지 case는 재귀적으로 주위에 이전 단계 도형이 그려지고 가운데가 뚫려있게끔 출력하면 된다.

사이즈가 27이면 주변이 위에 있는 사이즈 9의 도형이 둘러싼다.

 

 

처음엔 재귀를 이용하되, 함수 자체에서 cout을 하면 되겠다고 생각했지만, 개행을 해주면 재귀적으로 출력을 하기 힘들다고 판단했고, 2차원 배열에 저장한 뒤 나중에 한꺼번에 출력하게끔 풀었다.

 

가운데에 공백을 넣는 조건을 생각했는데, 재귀 호출을 할 때 row와 col을 사용하다 보니 공백을 유연하게 출력하지 못하겠다고 생각해서 아예 2차원 배열을 공백으로 초기화해주었다.

 

그 이후에는 사이즈가 3의 제곱수이기 때문에 3씩 나눠주면서 호출해주었다.

 

1. 사이즈가 3일 때(base case)

 - 그림과 같이 주변은 *을 저장하고 가운데가 뚫려있는 3X3 도형을 출력한다.

2. 사이즈가 3보다 클 때

 - 주변에 *을 저장하는 것이 아닌 base case 도형이 출력이 돼야 하므로 이 경우에 재귀 호출을 진행해준다.

 

설계만 잘하면 복잡하게 생각 안 해도 출력이 잘 되는 것을 볼 수 있다.

 

#include <iostream>

using namespace std;
int n;
char star[6562][6562];

void printStar(int col, int row, int size) {
	int tempsize = size / 3;
	if (size == 3) {
		for (int i = col; i < col+size; i++) {
			for (int j = row; j < row+size; j++) {
				if (i >= col+tempsize && i < col+tempsize * 2 && j >= row+tempsize && j < row+tempsize * 2) {
					star[i][j] = ' ';
				}
				else {
					star[i][j] = '*';
				}
			}
		}
	}

	else {
		for (int i = col; i < col + size; i += tempsize) {
			for (int j = row; j < row + size; j+= tempsize) {
				if (i >= col + tempsize && i < col + tempsize * 2 && j >= row + tempsize && j < row + tempsize * 2) {
					star[i][j] = ' ';
				}
				else {
					printStar(i, j, tempsize);
				}
			}
		}
	}
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> n;

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			star[i][j] = ' ';
		}
	}

	printStar(0,0,n);

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cout << star[i][j];
		}
		cout << "\n";
	}

}

재귀 호출의 시작은 0,0부터 해준다.

이후 2차원 배열에 저장하고, 출력해준다.

728x90
저작자표시 비영리 변경금지 (새창열림)

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

[baekjoon 1806] 부분합 (투 포인터) (C++)  (0) 2021.02.15
[baekjoon 1326] 폴짝폴짝 (BFS) (C++)  (0) 2021.02.13
[baekjoon 11729] 하노이의 탑 이동 순서 (재귀 호출) (C++)  (0) 2021.02.09
[baekjoon 2146] 다리 만들기 (그래프, BFS) (C++)  (0) 2021.02.08
[baekjoon 2110] 공유기 설치 (이진탐색) (C++)  (0) 2021.02.07
    '문제 풀이/백준 알고리즘' 카테고리의 다른 글
    • [baekjoon 1806] 부분합 (투 포인터) (C++)
    • [baekjoon 1326] 폴짝폴짝 (BFS) (C++)
    • [baekjoon 11729] 하노이의 탑 이동 순서 (재귀 호출) (C++)
    • [baekjoon 2146] 다리 만들기 (그래프, BFS) (C++)
    dev_beomgeun
    dev_beomgeun
    백엔드 개발을 하며 얻은 지식과 경험을 공유합니다. 현재 카카오페이에서 백엔드 엔지니어로 일하고 있습니다.

    티스토리툴바