/ [프로그래머스][C++][68645] 삼각 달팽이
본문 바로가기
코테준비/수학적 알고리즘

[프로그래머스][C++][68645] 삼각 달팽이

by sayho98 2023. 2. 27.

[문제 출처]

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;
}
반응형

댓글