문제 URL:
https://school.programmers.co.kr/learn/courses/30/lessons/68645
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
[문제 설명]
정수 n이 매개변수로 주어질 때, 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return하는 문제이다.

[문제 풀이]
달팽이 채우기는 왼쪽, 아래, 오른쪽 이렇게 3개의 구간으로 나뉘어서 채워진다.
이는 2차원 배열로 구현할 수 있으며 switch문으로 상태를 나누어 (0, 0)에서부터 차례대로 숫자를 채워주면 된다.

#include <string>
#include <vector>
#include <iostream>
using namespace std;
vector<int> solution(int n) {
vector<int> answer;
int arr[1000][1000]; // 2차원 배열을 이용해서 값을 입력
int x = 0, y = 0; // 시작 위치
int state = 0; // state -> 0: 왼쪽, 1: 아래, 2: 오른쪽
int num = 1; // 입력할 숫자
for(int i=0; i<n; i++) {
switch(state) {
case 0: // 왼쪽
for(int k=i; k<n; k++)
arr[x++][y] = num++;
x--;
y++;
state = 1;
break;
case 1: // 아래
for(int k=i; k<n; k++)
arr[x][y++] = num++;
x--;
y-=2;
state = 2;
break;
case 2: // 오른쪽
for(int k=i; k<n; k++)
arr[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(arr[i][j]);
}
}
return answer;
}