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

정올 1707 : 달팽이 사각형

by watergrace2u 2020. 4. 28.
반응형
SMALL

1. 첫번째 방법

이차원배열의 행열을 x,y로 두고 차례대로 횟수만큼 채워간다.

좌표 증가후 이차원배열에 수대입!! 대입을 먼저 한 후 증가하게되면 모서리부분(?)에서 수가 넘어가버린다.

-> y++

-> 이동횟수 감소

-> x++

-> 이동횟수 감소

-> x--

#include <stdio.h>

int main() {
	int n;
	scanf("%d", &n);

	int num = 1;
	int x = 0;
	int y = -1;
	int m = n; // 이렇게 안해놓으면 출력 시 문제
	// int arr[100][100]; 이렇게 하면 메모리 문제생김(오류는 안남)

	int** arr = new int* [n];  // 이부분만 c++이용하여 메모리 할당
	for (int i = 0; i < n; i++) {
		arr[i] = new int[n];
	}


	while (n > 0) {
		for (int j = 0; j < n; j++) {
			y++;
			arr[x][y] = num++;
		}
		n--; // 이동횟수 감소
		for (int j = 0; j < n; j++) {
			x++;
			arr[x][y] = num++;
		}
		for (int j = 0; j < n; j++) {
			y--;
			arr[x][y] = num++;
		}
		n--; // 이동횟수 감소
		for (int j = 0; j < n; j++) {
			x--;
			arr[x][y] = num++;
		}
	}
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < m; j++) {
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	for (int i = 0; i < n; i++) {
		delete[] arr[i];
	}
	delete[] arr;
	return 0;

}

2. 두번째 방법

진행방향으로 이동을 하다가 벽을 만나면 바꾸는 방식.

배열 전체를 0으로 초기화 한 후 출력할 영역 바깥 부분을 모두 1로 채워서 테두리를 만든다.

채워나가다가 다음에 이동할 위치에 채울 수 없다면(0이 아니면(1이 있으니까) )이동을 멈추고 방향을 바꾼다.

 

#include <stdio.h>
#include <string.h>

int main() {
	int n;
	scanf("%d", &n);

	int num = 1;
	int x = 1;
	int y = 0;
	int m = n;
	// int arr[100][100];

	int** arr = new int* [n+2];
	for (int i = 0; i < n+2; i++) {
		arr[i] = new int[n+2];
		memset(arr[i], 0, sizeof(int) *(n+2));
	}
    
   // 테두리를 둘러싸면 행열 2칸씩 늘어남 주의!!
   // 바깥테두리 1로 초기화
	for (int i = 0; i <n+2; i++) {   
		for (int j = 0; j <n+2; j++) {
			if (i == 0 || j == n+1 || i == n+1 || j == 0) {
				arr[i][j] = 1;
			}
		}
	}

	while (num<=n*n) {                        // 채울수가 n*n 이하인 동안
		while (arr[x][y + 1] == 0) {          // 오른쪽이 0인동안
			y++;
			arr[x][y] = num++;
		}
		while (arr[x + 1][y] == 0) {
			x++;
			arr[x][y] = num++;
		}
		while (arr[x][y - 1] == 0) {
			y--;
			arr[x][y] = num++;
		}
		while (arr[x - 1][y] == 0) {
			x--;
			arr[x][y] = num++;
		}
	}


	for (int i = 1; i <= m; i++) {
		for (int j = 1; j <= m; j++) {
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}

	for (int i = 0; i < n+2; i++) {
		delete[] arr[i];
	}
	delete[] arr;
	return 0;

}

반응형
LIST

댓글