본문 바로가기

알고리즘 · 코딩

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

문제 링크

programmers.co.kr/learn/courses/30/lessons/68645

 

코딩테스트 연습 - 삼각 달팽이

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]

programmers.co.kr


C++ 풀이

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

vector<int> solution(int n) {
    vector<int> answer;
    vector <vector<int>> triangles(n);
    for (int i = 0; i < n; i++)
        triangles[i].resize(i + 1);
    
    int startRow = 0; // 반시계 채우기를 시작할 층
    int endRow = n - 1;
    int startCol = 0;
    int currentNum = 1;
    while (1) { //반시계 방향으로 반복적으로 수 채우기

         //왼쪽 하단으로 내려가면서 채우기 ↙
        for (int i = startRow; i <= endRow; i++, currentNum++)
            triangles[i][startCol] = currentNum;

        // 아랫변 채우기 →
        for (int i = startCol + 1; i < n - startRow; i++, currentNum++) 
            triangles[endRow][i] = currentNum;

        //오른쪽 하단에서부터 올라가면서 채우기 ↖
        for (int i = endRow - 1; i > startRow; i--, currentNum++) 
            triangles[i][triangles[i].size() - startCol - 1] = currentNum;

        startRow += 2; // 다음 반시계 방향 채우기를 시작할 위치 갱신

        if (startRow >= endRow) //갱신한 startRow가 이미 채워진 Row와 겹치면 종료
            break;

        endRow -= 1;
        startCol += 1;
    }

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < triangles[i].size(); j++)
            answer.push_back(triangles[i][j]);
    }
    return answer;
}

 

 

 

반응형