[월간 코드 챌린지 시즌1] 삼각 달팽이 (C++)
https://school.programmers.co.kr/learn/courses/30/lessons/68645
풀이
주어진 삼각형을 이차원 배열
처럼 생각해주는 것이 이 문제의 포인트였다.
주대각선을 포함한 하삼각행렬과 같은 모양 switch문을 이용해 현재 삼각형의 왼쪽 변이나 아랫변, 오른변 중 어느 변을 이동하고 있는지 구분한 후, 현재 위치를 나타내는 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
#include <string>
#include <vector>
using namespace std;
vector<int> solution(int n) {
int size = n * (n + 1) / 2;
vector<vector<int>> triangle(n + 1, vector<int>(n + 1, 0));
char pos = 'l';
int i = 1, x = 0, y = 0;
while(i <= size){
int max_num = i + n - 1;
switch(pos){
case 'l':
while(i <= max_num)
triangle[y++][x] = i++;
pos = 'b', y--;
break;
case 'b':
while(i <= max_num - 1)
triangle[y][++x] = i++;
pos = 'r';
break;
case 'r':
while(i <= max_num - 2)
triangle[--y][--x] = i++;
pos = 'l', n -= 3, y++;
break;
}
}
vector<int> answer;
for(auto r : triangle)
for(auto c : r)
if(c != 0) answer.push_back(c);
return answer;
}
This post is licensed under CC BY 4.0 by the author.