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
- 함수 사용하기
- 1546
- for문 사용해보기
- 평균은 넘겠지
- Mist
- 가상 화폐
- 10817
- 그대로 출력하기
- 시험 성적
- 1110
- 백준
- 이더리움
- 단계별로 풀어보기
- 10871
- Baekjoon
- Dapp
- 2448
- 더하기 사이클
- Remix
- X보다 작은 수
- 블록 체인
- 자바스크립트
- if문 사용해보기
- 1065
- 세 수
- 1%d
- 솔리디티
- 별 찍기 - 11
- 비트 코인
- 알고리즘 문제풀이
Archives
- Today
- Total
블링블링 범블링
[백.단.풀.5] 별 찍기 - 11 (2448) 본문
Step : <함수 사용하기>
Title : " 별 찍기 - 11 "
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
---|---|---|---|---|---|
1 초 | 128 MB | 3881 | 1191 | 873 | 32.155% |
문제
예제를 보고 별찍는 규칙을 유추한 뒤에 별을 찍어 보세요.
입력
첫째 줄에 N이 주어진다. N은 항상 3*2^k 수이다. (3, 6, 12, 24, 48, ...) (k<=10)
출력
첫째 줄부터 N번째 줄까지 별을 출력한다.
예제 입력
24
예제 출력
* * * ***** * * * * * * ***** ***** * * * * * * ***** ***** * * * * * * * * * * * * ***** ***** ***** ***** * * * * * * ***** ***** * * * * * * * * * * * * ***** ***** ***** ***** * * * * * * * * * * * * ***** ***** ***** ***** * * * * * * * * * * * * * * * * * * * * * * * * ***** ***** ***** ***** ***** ***** ***** *****
아... 난 이런 문제에 너무 취약하다.. 못푸는 건 아닌데 시간이 너무 많이 걸린다.
예전부터 공부를 해서 익숙해져야지 하는데 공부를 해도 시간이 많이 걸린다.
재귀함수를 사용하는 법은 아는데, 응용이 쉽게 머리 속에서 팍팍 안되는 느낌?
딱 그런 느낌이다. 많이 푸는 것이 답이라는 것을 아니까 더 많이 풀어봐야지~
(그리고 이 별찍기가 내가 여태 해봤던 별찍기 중 가장 어려운 난이도다 ㅋㅋㅋ)
이번 문제의 핵심은 2가지 이다.
1. 함수를 재귀적으로 호출 (재귀)
2. 가장 작은 삼각형을 여러번 그린다고 생각하기
이 두가지를 중점적으로 생각해서 해결하면 된다.
우선 나는 순차적으로 재귀를 해야된다고 생각했고, Tree의 Traversal 방법 중 Left->Right -> Mid 의 순회인
post-order 후위 순회 방법을 택해서 재귀를 구현했다.
가장 작은 곳 까지 내려간 다음, Left의 그림을 만들고, Right의 그림, Mid 의 그림, 그리고 그 다음 작은 곳으로 올라가면서 같은 동작을 반복하도록 구현하였다.
이런 문제는 정말 혼자 풀어봐야지만 실력이 향상되는 문제이다.
그런 의미에서 오늘도 화이팅!
코드
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <malloc.h> int N; char star[3][7] = { " * ", " * * ", "***** " }; char board[4000][7000]; void startInsert(int startX, int endX, int startY, int endY) { if (endX - startX < 6) { for (int i = 0; i < 3; i++) for (int j = 0; j < 6; j++) board[startX + i][startY + j] = star[i][j]; } else { startInsert(startX + (endX - startX) / 2, endX, startY, startY + (endY - startY) / 2); startInsert(startX + (endX - startX) / 2, endX, startY + (endY - startY) / 2, endY); startInsert(startX, startX + (endX - startX) / 2, startY + (endY - startY) / 4, endY - (endY - startY) / 4); } } int main() { scanf("%d", &N); // 별을 그릴 판(board)을 공백으로 초기화 for (int i = 0; i <= N; i++) for (int j = 0; j <= N * 2; j++) board[i][j] = ' '; // 재귀 함수 startInsert(0, N, 0, N * 2); for (int i = 0; i < N; i++) { for (int j = 0; j <= N * 2; j++) printf("%c", board[i][j]); printf("\n"); } return 0; } | cs |
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백.단.풀.5] 한수 (1065) (0) | 2019.03.12 |
---|---|
[백.단.풀.5] 셀프 넘버 (4673) (0) | 2019.03.12 |
[백.단.풀.4] 더하기 사이클 (1110) (0) | 2019.03.12 |
[백.단.풀.4] 평균은 넘겠지 (4344) (0) | 2019.03.12 |
[백.단.풀.4] 평균 (1546) (0) | 2019.03.12 |
Comments