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

1 분 소요

1.문제 링크

삼각 달팽이



2. 풀이 전 계획과 생각

  • 규칙찾기



3. 풀이

#include <string>
#include <vector>
using namespace std;

bool check[1000][1000];
int map[1000][1000];
int dirx[] ={-1,0,1};
int diry[] ={-1,1,0};

vector<int> solution(int n) {
    vector<int> answer;
    int num=0; // 숫자
    
    // 초기 설정 (ㄴ)
    for(int i=0;i<n;i++){
        num++;
        map[0][i]=num;
        check[0][i]= true;
    }
    for (int i = 0; i < n-1; ++i) {
        num++;
        map[i+1][n-1]=num;
        check[i+1][n-1]=num;
    }

    int direction = 1;
    int cx = n-1, cy=n-1;
    int cnt_fail=0;
    while(1){
        // 범위를 벗어나는 경우 break
        if(direction==1){
            if(cx-1<0 || cy-1<0) break;
        }
        else if(direction==2){
            if(cy+1>=n) break;
        }
        else if(direction==3){
            if(cx+1>=n) break;
        }
        
        // 이미 입력된 배열이라면 방향바꾸기 
        if(check[cx+dirx[direction-1]][cy+diry[direction-1]]){
            if(direction==3) direction=1;
            else direction++;
            
            // 실패횟수가 3이면 break
            cnt_fail++;
            if(cnt_fail==3) break;
        }
        else{ // 배열에 값 입력 
            cx=cx+dirx[direction-1];
            cy=cy+diry[direction-1];
            cnt_fail=0;
            num++;
            map[cx][cy]=num;
            check[cx][cy]= true;
        }
    }

    // 정답 number 저장
    for(int i=0;i<n;i++){
        for(int j=0;j<=i;j++){
            answer.push_back(map[j][i]);
        }
    }
    return answer;
}

1.모든 n에 대해서 공통적으로 적용되는 ㄴ 자 형태를 채우기.

2-1. 3개방향에 대해서 범위를 벗어나는 경우 끝냄.

2-2. 가려는 방향의 배열 값이 이미 저장되어 있다면 방향을 바꾼다.

2-3. 만약 방향을 3번 바꾸고도 실패하면 끝냄.

2-4. 그것이 아니라면 배열에 값을 저장.

3.저장된 배열 값을 정답 배열에 저장.



4. 풀이하면서 고민했던 점

  • 규칙을 찾기가 어려웠음 배열에 숫자를 직접 저장하는 것으로 구현함.



5. 문제를 풀고 알게된 개념 및 소감

-