Updated:

2 minute read

개요

  • 달팽이 모양 숫자 출력


코드

#include <cstdio>
#include <iostream>
#include <tuple>
#include <vector>

using namespace std;

vector<int> solution(int row, int column) {
	vector<int> result(row * column);

	int x = 0;
	int y = -1;
	int move = -1;
	int value = 0;

	while (value != row * column) {
		++move;

		switch (move % 4) {
		case 0:
			for (int i = 0; i < column; ++i) {
				if (result[x * column + y + 1] != 0) {
					break;
				}
				result[x * column + ++y] = ++value;
				if (y == column - 1) {
					break;
				}
			}

			break;
		case 1:
			for (int i = 0; i < row; ++i) {
				if (result[(x + 1) * column + y] != 0) {
					break;
				}
				result[++x * column + y] = ++value;
				if (x == row - 1) {
					break;
				}
			}

			break;
		case 2:
			for (int i = 0; i < column; ++i) {
				if (result[x * column + (y - 1)] != 0) {
					break;
				}
				result[x * column + --y] = ++value;
				if (y == 0) {
					break;
				}
			}

			break;
		case 3:
			for (int i = 0; i < row; ++i) {
				if (result[(x - 1) * column + y] != 0) {
					break;
				}
				result[--x * column + y] = ++value;
				if (x == 0) {
					break;
				}
			}

			break;
		default:
			break;
		}
	}

	return result;
}

int main() {
	vector<tuple<int, int>> matrix = {make_tuple(0, 0), make_tuple(1, 1),
									  make_tuple(3, 3), make_tuple(5, 5),
									  make_tuple(5, 7), make_tuple(7, 5)};

	for (const auto& iter : matrix) {
		const int row = get<0>(iter);
		const int column = get<1>(iter);

		auto result = solution(row, column);
		cout << "---(" << row << ", " << column << ")---" << endl;
		for (int x = 0; x < row; ++x) {
			for (int y = 0; y < column; ++y) {
				printf("%3d ", result[x * column + y]);
			}
			cout << endl;
		}
		cout << "-----------" << endl << endl;
	}

	return 0;
}


결과

---(0, 0)---
-----------

---(1, 1)---
  1
-----------

---(3, 3)---
  1   2   3
  8   9   4
  7   6   5
-----------

---(5, 5)---
  1   2   3   4   5
 16  17  18  19   6
 15  24  25  20   7
 14  23  22  21   8
 13  12  11  10   9
-----------

---(5, 7)---
  1   2   3   4   5   6   7
 20  21  22  23  24  25   8
 19  32  33  34  35  26   9
 18  31  30  29  28  27  10
 17  16  15  14  13  12  11
-----------

---(7, 5)---
  1   2   3   4   5
 20  21  22  23   6
 19  32  33  24   7
 18  31  34  25   8
 17  30  35  26   9
 16  29  28  27  10
 15  14  13  12  11
-----------