문제 링크 https://programmers.co.kr/learn/courses/30/lessons/68645
문제
정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.
제한사항
- n은 1 이상 1,000 이하입니다.
풀이 과정
익숙해져야 되는 대표적인 구현 문제이다.
n = 1일 때는 1, n = 2일 때는 3, n = 3일 때는 6, n = 4일때는 10이므로
정수 n은 n * (n + 1) / 2 까지 도는 것을 알 수 있다.
만약 다음 방향으로 가는 곳이 0보다 작거나 n보다 크거나 같으면
가면 안 되는 방향이기 때문에 방향을 돌려준다.
또한, 0이 아니라면 이미 방문했다는 뜻이므로 방향을 돌려준다.
반복문이 끝났으면 0이 아닌 곳을 answer 벡터에 넣어주면 된다.
#include <string>
#include <vector>
using namespace std;
int dx[3] = {0, 1, -1};
int dy[3] = {1, 0, -1};
int arr[1001][1001];
int x, y, dir;
vector<int> solution(int n) {
vector<int> answer;
for(int i = 1; i <= n * (n + 1) / 2; i++){
arr[y][x] = i;
if(y + dy[dir] < 0 || y + dy[dir] >= n || x + dx[dir] < 0 || x + dx[dir] >= n || arr[y + dy[dir]][x + dx[dir]] != 0){
dir = (dir + 1) % 3;
}
y += dy[dir];
x += dx[dir];
}
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(arr[i][j]) answer.push_back(arr[i][j]);
}
}
return answer;
}
댓글남기기