프로그래머스 삼각달팽이 LV2

Jaedup·2024년 1월 19일
1

알고리즘 문제풀이

목록 보기
9/10

정수 n의 높이를 갖는 피라미드 구조 배열에 값을 채워넣는 문제이다.

피라미드 모양이 아닌 일반 배열의 모양이라고 생각하고 접근하면 수월하다.

이런 구조로 바꿔서 생각하면 접근이 훨씬 수월하다.

피라미드를 채우는 데에는 총 3가지 움직임이 필요하다.

  1. 아래로 이동
  2. 오른쪽으로 이동
  3. 좌측 상단으로 이동

이 3가지 움직임을 반복하면 올바르게 피라미드를 채울 수 있다.

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

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

    vector<vector<int>> v(n+1, vector<int>(n+1));
    int x = 0, y = 0;

    int state = 0;
    int num = 1;

    for(int i = 0; i < n; i++) {
        switch(state) {
            case 0:
                for(int k = i; k < n; k++) v[x++][y] = num++;
                x--;
                y++;
                state = 1;
                break;
            case 1:
                for(int k = i; k < n; k++) v[x][y++] = num++;
                x--;
                y-=2;
                state = 2;
                break;
            case 2:
                for(int k = i; k < n; k++) v[x--][y--] = num++;
                x+=2;
                y++;
                state = 0;
                break;
        }
    }

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

    return answer;
}

1개의 댓글

comment-user-thumbnail
2024년 1월 26일

저도 풀어보았던 문제인데, 설명해 주신 것 처럼 경우의 수를 나누어 풀 생각을 하지 못하고, 특정 알고리즘에 매몰되어 문제 푸는 데 애먹었던 기억이 나네요.. 잘 보고 갑니다 🫡

답글 달기