[프로그래머스 Level 2] 삼각 달팽이

🖊️ 문제

삼각 달팽이

 

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

 

제한사항

  • n은 1 이상 1,000 이하입니다.

 

🖥️ 코드

#include <string>
#include <vector>

using namespace std;

vector<int> solution(int n)
{
    vector<int> answer;
    vector<vector<int>> vv(n, vector<int>(n, 0));
    int dir = 0, col = 0, row = -1, value = 1;
    int _n = n;
    while (_n > 0)
    {
        if (dir == 0) // 하
        {
            for (int i = 0; i < _n; i++)
                vv[++row][col] = value++;
        }
        else if (dir == 1) // 우
        {
            for (int i = 0; i < _n; i++)
                vv[row][++col] = value++;
        }
        else //좌상
        {
            for (int i = 0; i < _n; i++)
                vv[--row][--col] = value++;
        }
        _n--, dir = ++dir % 3;
    }

    for (int i = 0; i < n; i++)
        for (int j = 0; j <= i; j++)
            answer.push_back(vv[i][j]);

    return answer;
}

 

 

방향 배열 사용 코드

#include <string>
#include <vector>

using namespace std;

vector<int> solution(int n)
{
    vector<int> answer;
    vector<vector<int>> vv(n, vector<int>(n, 0));
    int dir = 0, y = -1, x = 0, value = 1;
    //하 우 좌상
    vector<int> dirY = { 1, 0, -1 };
    vector<int> dirX = { 0, 1, -1 };
    int _n = n;

    while (_n > 0)
    {
        for (int i = 0; i < _n; i++)
        {
            y += dirY[dir];
            x += dirX[dir];
            vv[y][x] = value++;
        }
        _n--, dir = ++dir % 3;
    }

    for (int i = 0; i < n; i++)
        for (int j = 0; j <= i; j++)
            answer.push_back(vv[i][j]);

    return answer;
}

 

🤔 나의 생각

  • 패턴을 찾고 해결하는 단순 구현문제였다. 

  • 그림은 정삼각형이지만 배열의 시선으로 보면 직각 삼각형이 보인다.

  • 하(下), 우(右), 좌상 세 가지 패턴으로 숫자가 채워진다. 신기하게도 그 패턴은 n만큼 반복한다!   

  • 방향에 따라 행과 열 번호를 증감하며 value를 벡터에 대입한다.

  • 반복되는 for문이 굉장히 거슬렸는데 고민해 보니 방향 배열을 쓰면 해결될 문제였다.