알고리즘/프로그래머스

[프로그래머스 C++] - 삼각 달팽이

문제 : 삼각 달팽이

문제 설명

정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.

https://programmers.co.kr/learn/courses/30/lessons/68645

 

 분석

 일단 탑 구조의 형태를 계단 형태로 바꿔주고 생각해보자.

 

n = 4일 때

계단 형태로 바꾸니 배열 형태로 가정할 수 있다. 이때 규칙을 다음과 같이 찾을 수 있다.

n = 4일 때

0. 하양 → 우향 → 좌상 → 순으로 반복이 된다.

1. 길이는 n에서 반복할 수록 1씩 감소한다.

2. 방향이 꺽이는 총횟수는 n이다.

 

 

 구현

vector<int> solution(int n) 
{
	vector<int> answer;
	vector<vector<int>> snail(n, vector<int>(n));
	int value = 1, way = 0, y = 0, x = 0;

	for (size_t i = 0; i < n; i++)
	{
		switch (way)
		{
		// 하양
		case 0:
			for (size_t j = i; j < n; j++)
			{
				snail[y++][x] = value++;
			}
			y--;
			x++;
			way = 1;
			break;
		// 우향
		case 1:
			for (size_t j = i; j < n; j++)
			{
				snail[y][x++] = value++;
			}
			y--;
			x -= 2;
			way = 2;
			break;
		// 좌상향
		case 2:
			for (size_t j = i; j < n; j++)
			{
				snail[y--][x--] = value++;
			}
			y += 2;
			x++;
			way = 0;
			break;
		}
	}

	// input answer
	for (size_t i = 0; i < n; i++)
	{
		for (size_t j = 0; j < i + 1; j++)
		{
			answer.push_back(snail[i][j]);
		}
	}

	return answer;
}