[프로그래머스] Level.2 월간코드챌린지 시즌 1-삼각 달팽이

2021. 1. 12. 17:20Algorithm/프로그래머스

 

코딩테스트 연습 - 삼각 달팽이

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]

programmers.co.kr

 

 

문제설명
입출력예

 

 

달팽이 배열은 밑으로 이동, 옆으로이동, 대각선으로 이동으로 3가지로 구분된다.

방향을 바꿀때마다 반복되는 횟수 (이동하는 횟수)가 1씩 줄어드는 것을 이용하여 풀었다.

 

처음에는 이 규칙을 찾지못해 위치를 일일이 변수에 넣어가며 풀었는데 풀수록 소스코드가 너무

길어지는 것 같아 다시 풀기를 반복했다  ㅠㅠㅠㅠㅠㅠ다른 사람들의 풀이도 한번 봐야겠다

 

#include <string>
#include <vector>

using namespace std;

vector<int> solution(int n) {
    vector<int> answer;
    vector<vector<int>>v;
	v.assign(n, vector<int>(n, 0));

	int i = -1, j = 0;
	int num = 0;
	int repeat = n;

	while (1) {
		for (int k = 0;k < repeat;k++) {
			i++;
			v[i][j] = ++num;
		}
		if (repeat == 0)break;
		else repeat--;


		for (int k = 0;k < repeat;k++) {
			j++;
			v[i][j] = ++num;
		}
		if (repeat == 0)break;
		else repeat--;

		for (int k = 0;k < repeat;k++) {
			i--, j--;
			v[i][j] = ++num;
		}
		if (repeat == 0)break;
		else repeat--;
	}
	for (int i= 0;i < n;i++) {
		for (int j = 0;j <= i;j++) {
			answer.push_back(v[i][j]);
		}
	}
    return answer;
}