[문제 출처]
https://school.programmers.co.kr/learn/courses/30/lessons/68645
1. 문제
설명
정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.
제한사항
- n은 1 이상 1,000 이하입니다.
입출력 예
n | result |
4 | [1,2,9,3,10,8,4,5,6,7] |
5 | [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9] |
6 | [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11] |
2. 설명
규칙을 살펴보니 먼저 1. 하강 2. 우측이동 3. 좌상단이동 세가지가 반복되었습니다. 따라서 이를 구현해주었습니다.
이때 이동이 끝난후 x,y좌표를 그대로 넘겨주면 그부분에 num이 갱신되기 때문에 다음위치에 맞추어 x,y값을 수정해주는 것이 꼭 필요했습니다.
3. 코드
#include <string>
#include <vector>
#include <iostream>
using namespace std;
vector<int> solution(int n) {
vector<int> answer;
vector<vector<int>> snail(n, vector<int>(n,0));
int num=1;
int way=1;
int y=0, x=0;
for(int i=0; i<n; i++){
if(way==1){ // 하단이동
for(int j=i; j<n; j++){
snail[y][x]=num;
num++;
y++;
}
way=2;
y--;
x++;
continue;
}
if(way==2){ //우단이동
for(int j=i; j<n; j++){
snail[y][x]=num;
num++;
x++;
}
way=3;
x-=2;
y--;
continue;
}
if(way==3){ //좌상단 이동
for(int j=i; j<n; j++){
snail[y][x]=num;
num++;
x--;
y--;
}
way=1;
x++;
y+=2;
continue;
}
}
for(int i=0; i<n; i++){
for(int j=0; j<=i; j++)
answer.push_back(snail[i][j]);
cout<<"\n";
}
return answer;
}
반응형
'코테준비 > 수학적 알고리즘' 카테고리의 다른 글
[프로그래머스][C++][62048] 멀쩡한 사각형 (0) | 2023.03.09 |
---|---|
[프로그래머스][C++][135807] 숫자 카드 나누기 (0) | 2023.03.09 |
[프로그래머스][C++][42746] 가장 큰 수 (0) | 2023.02.22 |
[프로그래머스][C++][12913] 땅따먹기 (0) | 2023.02.20 |
[프로그래머스][C++]n^2배열 자르기 (0) | 2023.02.10 |
댓글