이런 구조로 바꿔서 생각하면 접근이 훨씬 수월하다.
피라미드를 채우는 데에는 총 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;
}
저도 풀어보았던 문제인데, 설명해 주신 것 처럼 경우의 수를 나누어 풀 생각을 하지 못하고, 특정 알고리즘에 매몰되어 문제 푸는 데 애먹었던 기억이 나네요.. 잘 보고 갑니다 🫡