Time does not change us. It just unfolds us.

Coding Test

[카카오]Lv2 삼각 달팽이 C++

소젬 2022. 4. 23. 01:56

프로그래머스에서 core dumped 나오면 에러 찾기 너무 힘들다...

vector index를 잘못 접근한 경우가 가장 많댜

 

문제 설명

정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.


제한사항
  • n은 1 이상 1,000 이하입니다.

입출력 예nresult
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

 

https://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

 


 

#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));

    pair<int, int> start_p = make_pair(0, 0);
    pair<int, int> end_p = make_pair(1, 1);
    int value = 1;

    int i = 0;
    while (snail[start_p.first][start_p.second] == 0) {
        //#1 ↓
        for (int j = start_p.first; j < n - i; j++)
            snail[j][start_p.second] = value++;
        start_p = make_pair(n - i - 1, start_p.second+1);
        if (snail[start_p.first][start_p.second] != 0)break;

        //#2 →
        for (int j = start_p.second; j < n - i * 2; j++)
            snail[start_p.first][j] = value++;
        start_p = make_pair(start_p.first, n - i * 2 - 1);

        //#3 ↖
        int sy = start_p.first - 1, sx = start_p.second - 1;
        if (snail[sy][sx] != 0)break;
        while (sy != end_p.first || sx != end_p.second) {
            snail[sy][sx] = value++;
            sy--, sx--;
        }
        snail[sy][sx] = value++;

        start_p = make_pair(end_p.first + 1, end_p.second);
        end_p = make_pair(end_p.first + 2, end_p.second + 1);
        i++;
    }
    
    for (int y = 0; y < n; y++) {
        for (int x = 0; x < n; x++) {
            if(snail[y][x] !=0) answer.push_back(snail[y][x]);
            else break;
        }
    }
    
    return answer;
}

 


단순하게 n*n 의 vector에서 아래 우 왼쪽 대각선 위 순서로 값을 채워넣었다.

start point와 end point가 수열로 이루어진 점을 이용하려 했는데 못썼다...

 


다른 사람 소스 : 나는 규칙은 이해했는데 왜 이해한대로 구현하지 못했을까

#include <string>
#include <vector>
using namespace std;
int arr[1000][1000];
vector<int> solution(int n) {
    vector<int> answer;
    int p = n;
    int k = 1;
    int x = -1, y = 0;
    for (int i = 0; i < n; i++) {
        for (int j = p;j >= 1; j--) {
            if(i%3==0) {
                arr[++x][y] = k;
            } else if (i % 3 == 1) {
                arr[x][++y] = k;
            } else if (i % 3 == 2) {
                arr[--x][--y] = k;
            }
            k++;
        }
        p--;
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j <= i;  j++) {
            answer.emplace_back(arr[i][j]);
        }
    }

    return answer;
}