본문 바로가기
정올 문제풀이

정올 1331 : 문자마름모

by watergrace2u 2020. 4. 28.
반응형
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

댓글