Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 브런치
- 10773
- BAKA
- The Balance of the World
- c++
- 입력 버퍼
- 바샤
- LJESNJAK
- system programming
- 5622
- 1874
- c
- 2941
- 4949
- 균형잡힌 세상
- 시프
- 백준
- 전자책
- IT
- Baekjoon
- process control
- 시스템 프로그래밍
- Zero That Out
- file IO
- File 조작
- Process Communication
- QA
- For Beginners
- 해바
- Parenthesis
Archives
- Today
- Total
해바
2447) 6. 함수 : 별 찍기 - 10 본문
문제
https://www.acmicpc.net/problem/2447
2447번: 별 찍기 - 10
첫째 줄에 N이 주어진다. N은 항상 3의 제곱꼴인 수이다. (3, 9, 27, ...) (N=3k, 1 ≤ k < 8)
www.acmicpc.net
풀이
다음과 같이 3 ✕ 3의 모양을 기반으로 중앙에 공백을 두며 그려지는 규칙이 있다. 이거 발견하는데도 애먹었다..
★ | ★ | ★ |
★ | ★ | |
★ | ★ | ★ |
가장 먼저 33 크기의 이차원 배열을 만들어서, 큰 규모의 배열에 옮겨 출력하면 어떨까 하는 아이디어가 떠올랐다. 그래서 입력한 수만큼의 이차원 배열을 생성해주는 함수와 기본 그림을 만드는 함수를 제작했는데, 가만 보니 크기가 커질수록 공백 크기도 달라지는데, 굳이 기본 그림을 만드는 의미가 없었다.
별을 찍는 방법은
- 재귀 함수(Recursive Function)
- Only 반복문
둘 중 하나를 적용하면 해결된다. 나에겐 많이 어려웠던 문제라 각각의 코드를 올려놓고 자주 봐야겠다.
1. 재귀 함수(Recursive Function, 배열 사용)
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
// ***
// * *
// ***
void drawStar(char** stars, int size, int a, int b) {
// 전체 그림을 그림
if(size == 1) {
stars[a][b] = '*';
return;
}
int n(size / 3);
for(int i(0); i < 3; i++) {
for(int j(0); j < 3; j++) {
if(!(i == 1 && j == 1)) drawStar(stars, n, a + (i * n), b + (j * n));
}
}
}
char** makeArr(char** stars, int size) {
// 여기서 입력한 수만큼 백지를 제작함
stars = (char**)malloc(sizeof(char*) * size);
for(int i(0); i < size; i++) {
stars[i] = (char*)malloc(sizeof(char) * size);
memset(stars[i], ' ', sizeof(char) * size); // 배열 내용을 공백(' ')으로 초기화함
}
return stars;
}
int main() {
int size(0);
char** stars(NULL);
scanf("%d", &size);
stars = makeArr(stars, size);
drawStar(stars, size, 0, 0);
for(int i(0); i < size; i++) {
for(int j(0); j < size; j++) {
putchar(stars[i][j]);
}
puts("");
}
free(stars);
return 0;
}
size가 1일 때만 별을 찍는단 얘기는 가장 작은 크기를 기준으로 했을 때만 별을 찍는다는 의미이다.
위 코드에서는 별을 한 개 찍을 때마다 함수를 한번 호출하므로 3 ✕ 3 크기를 그리는 데는 9번 호출된다.
2. Only 반복문(배열 사용 X)
'C, C++' 카테고리의 다른 글
10809) 7. 문자열 : 알파벳 찾기 (0) | 2019.08.12 |
---|---|
11720) 7. 문자열 : 숫자의 합 (0) | 2019.08.12 |
1065) 6. 함수 : 한수 (0) | 2019.08.07 |
4673) 6. 함수 : 셀프 넘버(Self Number) (0) | 2019.08.06 |
10817) 2. if문 : 세 수 (0) | 2019.08.06 |
Comments