Written

프로그래머스 레벨2 <삼각 달팽이> C++ 풀이 본문

알고리즘 문제풀이

프로그래머스 레벨2 <삼각 달팽이> C++ 풀이

steeringhead 2023. 9. 19. 14:56

https://school.programmers.co.kr/learn/courses/30/lessons/68645

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

결국 문제에 조건이 주어져 있는것처럼, 구현을 하는 문제라고 생각을 했습니다. 

특별한 알고리즘을 사용하는 것은 아니고 구현 문제라고 생각하여, 일단 3가지의 케이스가 있으니 각 케이스에 맞게 함수를 구현해봤습니다. 그리고 모든 테스트케이스가 위에서 왼쪽 아래로 -> 오른쪽으로 -> 왼쪽위로 계속 돌다가 끝나는 구조입니다.

 

다만, 어떤 케이스에서 끝날지는 모르고, 그 대신 총 횟수는 Input값인 n만큼만 진행됩니다. 이런 특징들에 맞게 구현을하면 크게 어렵지 않게 구현이 가능합니다. 저는 워낙 구조체를 좋아하여 구조체를 사용해서 구현해봤습니다. 그리고 숫자들을 입력할 수 있게 2차원 배열을 생성했습니다. 문제에서 그려진 그림에는 피라미드 형태로 그려지고 있지만, 왼쪽으로 다 밀어버렸다고 가정해도 똑같습니다. 그리고 그 형태는 일반적인 2차원 배열과 같습니다. 구조체의 cnt는 찍어내는 총 횟수고 , val값은 처음 찍기시작할 값입니다.

 

채점을 받는데 분명 로직적으로는 문제가 없는데 출력이 잘 안찍혔습니다. 그래서 VS로 옮겨서 하나씩 디버깅해본 결과, 각각의 함수에서 마지막에 리턴하는 구조체의 x와y의 좌표값이 수정이 필요했습니다. 리턴값으로 받은 그대로 다음 단계에서 바로 숫자를 찍어내기 때문에 x와y값을 바로 다음 단계를 진행할 그 위치를 곧장 리턴해주도록 수정하니, 정답으로 채점 받을 수 있었습니다. 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <string>
#include <vector>
 
using namespace std;
 
int map[1000][1000];
 
struct Node
{
    int x;
    int y;
    int val;
    int cnt;
    Node(int a, int b, int c, int d)
    {
        x = a;
        y = b;
        val = c;
        cnt = d;
    }
};
 
Node leftBottom(int x, int y, int val, int cnt)
{
    int tmp = cnt - 1;
    while (cnt > 0)
    {
        cnt--;
        if (map[x][y] == 0)
        {
            map[x][y] = val++;
            x++;
        }
    }
 
    return Node(x-1, y+1, val, tmp);
}
 
Node rightTop(int x, int y, int val, int cnt)
{
    int tmp = cnt - 1;
    while (cnt > 0)
    {
        cnt--;
        if (map[x][y] == 0)
        {
            map[x][y] = val++;
            y--;
            x--;
        }
    }
    return Node(x + 2,y + 1, val, tmp);
}
 
Node right(int x, int y, int val, int cnt)
{
    int tmp = cnt - 1;
    while (cnt > 0)
    {
        cnt--;
        if (map[x][y] == 0)
        {
            map[x][y] = val++;
            y++;
        }
    }
    return Node(x-1, y-2, val, tmp);
}
 
 
vector<int> solution(int n) {
    vector<int> answer;
    int cnt = 0;
    auto init = Node(001, n);
 
    while (cnt < n)
    {
        auto cur1 = leftBottom(init.x, init.y, init.val, init.cnt);
        cnt++;
        auto cur2 = right(cur1.x, cur1.y, cur1.val, cur1.cnt);
        cnt++;
        auto cur3 = rightTop(cur2.x, cur2.y, cur2.val, cur2.cnt);
        init = Node(cur3.x, cur3.y, cur3.val, cur3.cnt);
        cnt++;
    }
 
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (map[i][j] != 0)
                answer.push_back(map[i][j]);
            else
                break;
 
        }
    }
 
    return answer;
}
cs
Comments