관리 메뉴

Kim's Programming

1954. 달팽이 숫자 본문

SW ExpertAcademy/D2

1954. 달팽이 숫자

Programmer. 2018. 12. 1. 01:13

1954. 달팽이 숫자

문제출처: https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PobmqAPoDFAUq&categoryId=AV5PobmqAPoDFAUq&categoryType=CODE




풀이 방법


배열 크기를 지정해두고 왼쪽 위에서 부터 오른쪽으로 시작하여 끝에 도달하면 시계 방향 90도로 꺽어 진행하도록 하였다.


<코드>


#include<iostream>
using namespace std;
//north :0 East :1 south :2 West :3
int* moveTo(int* current, int size, int direction)
{
	switch (direction)
	{
	case 0:
		return current - size;
	case 1:
		return current + 1;
	case 2:
		return current + size;
	case 3:
		return current - 1;
	}
	return nullptr;
}

int main(int argc, char** argv)
{
	int test_case;
	int T;
	cin >> T;

	for (test_case = 1; test_case <= T; ++test_case)
	{
		int input{ 0 };
		std::cin >> input;
		int direction = 2;

		int* dataArray = new int[input*input]{ 0, };
		int* pointer = &dataArray[input - 1];
		int inputData = input + 1;

		for (int i = 0; i < input; i++)
			dataArray[i] = i + 1;

		for (int i = input - 1; i > 0; i--)
		{
			for (int j = 0; j < i; j++)
			{
				pointer = moveTo(pointer, input, direction);
				*pointer = inputData;
				inputData++;
			}

			direction = direction + 1 > 3 ? 0 : direction + 1;

			for (int j = 0; j < i; j++)
			{
				pointer = moveTo(pointer, input, direction);
				*pointer = inputData;
				inputData++;
			}

			direction = direction + 1 > 3 ? 0 : direction + 1;
		}

		std::cout << "#" << test_case << "\n";
		for (int i = 0; i < input; i++)
		{
			for (int j = 0; j < input; j++)
				std::cout << dataArray[i * input + j] << " ";
			std::cout << "\n";
		}

		delete[] dataArray;
	}

	return 0;//정상종료시 반드시 0을 리턴해야합니다.
}


'SW ExpertAcademy > D2' 카테고리의 다른 글

1961. 숫자 배열 회전  (0) 2018.12.01
1959. 두 개의 숫자열  (0) 2018.12.01
1948. 날짜 계산기  (0) 2018.12.01
1946. 간단한 압축 풀기  (0) 2018.12.01
1945. 간단한 소인수분해  (0) 2018.12.01