티스토리 뷰
Explain.
Approach
\( N = 3*2^k (k<=10) \) 출력될 총 줄수(높이)
\(C =\) 그려야할 총 삼각형의 개수
$$C=3^{k-1} = (1, 3, 9, 27, ... )$$
위처럼 k값이 증가할때마다 그려야할 삼각형의 개수가 \(3^{k-1}\) 의 형태를 띄고있다.
이를 활용하여 recursion한 방식으로 의사코드를 작성해보면
input : N = 삼각형의 줄수
output : 삼각형 출력
\(H = N * 2 + 1 \) 밑변의 크기
A[ H * H ] = 삼각형이 저장 될 배열
void recursive(A : array[1...H, 1...H], x : integer, y : integer, h : interger)
if h = 3 then
A[x,y] = *
A[x,y+1] = *
A[x+2,y+1] = *
A[x,y+2] = *
for i=0 to 4 do
A[x+i,y+2] = *
else
recursive(A,x,y+h/2,h/2)
recursive(A,x+h,y+h/2,h/2)
recursive(A,x,y,h/2)
위형태로 작성할 수 있다. 이때 실제 구현시에서는 문제의 삼각형의 모양처럼 x값 앞에 offset값을 줘서 입력해야되는점을 명심해야한다.
Code
#include <stdio.h>
#include <stdlib.h>
void recursive(char **arr, int x, int y,int h, int offset);
void print(char **arr,int w, int h);
int main(void)
{
char **arr;
int w,i,h,j;
scanf("%d", &h);
arr = (char**)malloc(sizeof(*arr) * h);
w = h * 2 + 1;
for (i = 0; i < h; ++i)
{
arr[i] = (char*)malloc(sizeof(*arr) * w + 1);
arr[i][w] = '\0';
}
for(i=0;i<h;++i)
{
for(j=0;j<w;++j)
{
arr[i][j] = ' ';
}
}
recursive(arr, 0, 0, h, h-1);
print(arr, w, h);
free(arr);
return 0;
}
void print(char **arr,int w,int h)
{
int i, j;
for (i = 0; i < h; ++i)
{
printf("%s\n", arr[i]);
}
}
void recursive(char **arr, int x, int y, int h,int offset)
{
int i,pad = offset - y;
if(h==3)
{
arr[y][x + pad--] = '*';
arr[y + 1][x + pad] = '*';
arr[y + 1][x + 2 + pad--] = '*';
for(i=0;i<5;++i)
arr[y + 2][x + i + pad] = '*';
return;
}
else
{
recursive(arr,x+h,y+h/2,h/2,offset);
recursive(arr,x,y+h/2,h/2,offset);
recursive(arr,x,y,h/2,offset);
}
}
'Algorithm' 카테고리의 다른 글
2665 - 미로 만들기 + 경로 출력 (0) | 2016.11.30 |
---|---|
N Queen Problem - Backtracking (0) | 2016.11.30 |
Matrix chain multiplication (0) | 2016.10.12 |
Floyd's Algorithm (0) | 2016.10.12 |
4673_셀프 넘버 (0) | 2016.10.05 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- robocopy
- DNS
- Bit
- python
- 비트연산자
- 삼항연산자
- 행렬
- mysql
- mathjax
- algorithm
- 비트
- C
- 비트마스크
- Kotlin
- 수식
- 알고리즘
- Highlighter
- 안드로이드
- syntax highlighting
- highlightjs
- Math
- Matrix
- Android
- 도메인
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함