본문 바로가기

알고리즘 문제 풀이

[하한문] 프로그래머스 - 삼각달팽이

위와 같은 탑 모양의 순열을 만드는 것이다. 규칙을 찾아서 수식화 하기에는 너무 어려워 보여서 

2차원 배열을 통해서 똑같이 생성하는 함수를 만들기로 했다.

 

저렇게 생겼지만 실제로는

 

1

2 9

3 10 8

4  5  6  7      이렇게 생겼다고 생각하면 만들기에 더 간편했다.

#include <string>
#include <vector>
#include <iostream>
using namespace std;

int arr[1000][1000];

vector<int> solution(int N) {
    vector<int> answer;
    int num=1;
    int lv =1;
    int x=0,y=0;
    while(true){
        int temp = num;
        if(lv == 1){
           while(x<N && y<N){
                if(arr[x][y] == 0){
                    arr[x][y] = num;
                    num++;
                    x++;
                }
                else{
                    y++;
                    x--;
                    lv=2;
                    break;
                }
           }
           if(lv == 1){
               lv =2;
               y++;
               x--;
           }
       }
       if(lv == 2){
           while(x<N && y<N){
                if(arr[x][y] == 0){
                    arr[x][y] = num;
                    num++;
                    y++;
                }
                else{
                    x--; y-=2;
                    lv=3;
                    break;
                }
           }
           if(lv == 2){
               x--; y-=2;
               lv =3;
           }
       }
       if(lv == 3){
            while(x<N && y<N){
                if(arr[x][y] == 0){
                    arr[x][y] = num;
                    num++;
                    x--; y--;
                }
                else{
                    x+=2; y++;
                    lv=1;
                    break;
                }
           }              
       }   
       if(num == temp)
           break;
   }
    
   for(int i=1;i<=N;i++){
       for(int j=0;j<i;j++){
           answer.push_back(arr[i-1][j]);
       }
   }
    
   return answer;
}

각 레벨을 정해서

레벨 1 : 아래로 내려가면서 채워 넣기

레벨 2 : 오른쪽으로 채워 넣기

레벨 3 : 왼쪽 대각선으로 채워넣기 

 

해서 위와 같은 2차원 배열을 생성한 뒤  마지막 정답 벡터에 넣어주었다.

 

 

출처 - 프로래머스