게임 클라이언트 개발/알고리즘 문제

[2] 삼각 달팽이 (구현)

주운녕 2025. 1. 31. 18:00

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


제한사항
n은 1 이상 1,000 이하입니다.
입출력 예
n result
4 [1,2,9,3,10,8,4,5,6,7]
5 [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9]
6 [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11]


문제 풀이

index 이동 방향
(1, 0) => 1차원 index 증가
(0, 1) => 2차원 index 증가
(-1, -1) => 1,2차원 index 감소
방향으로 회전하면서 값을 방문하고,
방문한 값을 만나면 방향 전환

n 에 따라 최대 길이만큼 반복

#include <string>
#include <vector>

using namespace std;

enum Direction
{
	Down = 0,
	Right,
	Up
};

int dirI[] = { 1, 0, -1 };
int dirJ[] = { 0, 1, -1 };

vector<int> solution(int n) {
	vector<int> answer;

	vector<vector<int>> vec;
	for (int i = 0; i < n; i++)
	{
		vector<int> temp(i + 1);
		vec.push_back(temp);
	}

	int length = n * (n + 1) / 2;
	Direction dir = Down;
	int idxI = 0;
	int idxJ = 0;
	int val = 1;
	while (val <= length)
	{
		// index 범위 넘거나, 이미 값이 차있으면 next Dir
		if (idxI >= vec.size() || idxJ >= vec[idxI].size() || vec[idxI][idxJ] != 0)
		{
			idxI -= dirI[dir];
			idxJ -= dirJ[dir];
			dir = Direction((int)dir + 1);
			if (dir > Up)
				dir = Down;
		}
		else
		{
			vec[idxI][idxJ] = val;
			val++;
		}

		idxI += dirI[dir];
		idxJ += dirJ[dir];
	}

	for (int i = 0; i < vec.size(); i++)
	{
		for (int j = 0; j < vec[i].size(); j++)
		{
			answer.push_back(vec[i][j]);
		}
	}

	return answer;
}