반응형
SMALL
이차원배열의 행렬을 각각 x,y로 두고 진행한다.
우선 A,B,C,D... 어떤 순서로 진행되는지 규칙을 살펴보기 위해 모두 써보았다. (x,y) (이후 순서쌍 괄호, 콤마 생략)
n=4일때 가정으로 미리 종이에 6*6 모눈종이를 그려놓고 행렬을 보기쉽게 해두면 이해하기 쉽다.
** n=4일때 가정 **
첫번째 마름모(가장 바깥쪽) : 03 12 21 30 41 52 63 54 45 36 25 14
두번째 마름모 : 13 22 31 42 53 44 35 24
세번째 마름모 : 23 32 43 34
네번째 마름모 : 33
위에 표시해둔 글자색을 자세히 보면 규칙을 쉽게 찾을 수 있다.
보라색 부분에서는 x++, y--
노랑색 부분에서는 x++, y++
초록색 부분에서는 x--, y++
검은색 부분에서는 x--, y--
빨간색(기준) 부분은 마름모의 중점이 되는 잠시 평평해지는 부분이다. 반복문을 새로 돌때마다 빨간색 부분을 기준으로 삼기위해 따로 초기화해주었다.
빨간색부분을 제외한 부분은 반복될때마다 횟수가 줄어든다.
마름모의 한변의 길이(n) = 마름모의 개수 = 반복해야하는 횟수 = 가장 바깥쪽 반복문이 도는 횟수
#include <stdio.h>
#include <string.h>
int main() {
int n;
scanf("%d", &n);
char ch = 'A';
// 이차원 배열 할당은 c++을 이용하였다.
char** arr = new char*[2*n];
for (int i = 0; i < 2 *n; i++) {
arr[i]= new char[2 *n];
memset(arr[i], '\n', sizeof(char) * 2 * n);
}
int x;
int y;
int tmp = n;
for(int i=0;i<n;i++){
x = i; // 빨간색 부분(마름모 한 개를 채우고 돌아올때마다 초기화됨)
y = n - 1;
// 보라색부분
for (int j = 0; j < n - 1 - i; j++) {
if (ch > 'Z')ch = 'A';
arr[x][y] = ch++;
x++, y--;
}
// 노랑색부분
for (int j = 0; j < n - 1 - i; j++) {
if (ch > 'Z')ch = 'A';
arr[x][y] = ch++;
x++, y++;
}
// 초록색 부분
for (int j = 0; j < n - 1 - i; j++) {
if (ch > 'Z')ch = 'A';
arr[x][y] = ch++;
x--, y++;
}
// 검은색 부분
for (int j = 0; j < n - 1 - i; j++) {
if (ch > 'Z')ch = 'A';
arr[x][y] = ch++;
x--, y--;
}
}
arr[tmp - 1][tmp - 1] = ch; // 마름모의 정가운데 부분. 코드를 이해해보면 왜 써야하는지 알게 될 것이다.
for (int i = 0; i < 2 * tmp - 1; i++) {
for (int j = 0; j < 2 * tmp - 1; j++) {
if (arr[i][j] == '\n')printf(" "); // 공백 2칸 필수!
else printf("%c ", arr[i][j]);
}
printf("\n");
}
for (int i = 0; i < 2 * n; i++) { // 메모리해제
delete[] arr[i];
}
delete[] arr;
}
실제로 정올사이트에 제출해보면 90% 만 정답으로 인정해주는데 그 이유는 잘 모르겠다. 그래도 모양은 잘나온다.
반응형
LIST
'정올 문제풀이' 카테고리의 다른 글
정올 1740 : 소수 (0) | 2020.04.29 |
---|---|
정올 1009 : 각 자릿수의 역과 합 (0) | 2020.04.28 |
정올 1707 : 달팽이 사각형 (0) | 2020.04.28 |
정올 1339 : 문자삼각형 2 (0) | 2020.04.27 |
정올 1002 : 최대공약수, 최소공배수 응용 (0) | 2020.04.27 |
댓글