Skip to content

Commit d474e4b

Browse files
committed
add: 프로그래머스/삼각달팽이
1 parent cfd99bb commit d474e4b

2 files changed

Lines changed: 120 additions & 0 deletions

File tree

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# [삼각 달팽이 / 68645](https://programmers.co.kr/learn/courses/30/lessons/68645?language=javascript)
2+
## What
3+
###### Description
4+
5+
정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.
6+
7+
![examples.png](https://grepp-programmers.s3.ap-northeast-2.amazonaws.com/files/production/e1e53b93-dcdf-446f-b47f-e8ec1292a5e0/examples.png)
8+
9+
* * *
10+
11+
##### 제한사항
12+
13+
* n은 1 이상 1,000 이하입니다.
14+
15+
* * *
16+
17+
##### 입출력 예
18+
19+
<table class="table"><thead><tr><th>n</th><th>result</th></tr></thead><tbody><tr><td>4</td><td><code>[1,2,9,3,10,8,4,5,6,7]</code></td></tr><tr><td>5</td><td><code>[1,2,12,3,13,11,4,14,15,10,5,6,7,8,9]</code></td></tr><tr><td>6</td><td><code>[1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11]</code></td></tr></tbody></table>
20+
21+
* * *
22+
23+
##### 입출력 예 설명
24+
25+
입출력 예 #1
26+
27+
* 문제 예시와 같습니다.
28+
29+
입출력 예 #2
30+
31+
* 문제 예시와 같습니다.
32+
33+
입출력 예 #3
34+
35+
* 문제 예시와 같습니다.
36+
> 출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/courses/30/lessons/68645
37+
38+
## How
39+
아래, 오른쪽, 위 이렇게 반복적으로 반시계 방향으로 삼각형을 순회한다고 가정하고 배열의 맨 윗줄부터 채우도록 요구하는 문제이다. 즉, 이 세 가지 경우를 나눠서 반복하면 된다.
40+
41+
이차원 배열에 각 경우에 맞는 형태로 방향을 이동하며 값을 채워나간다. dx와 dy 배열을 정의해서 방향에 따라 위치 index를 변경할 수 있도록 하였다. 값을 1씩 증가하여 해당 index의 값으로 반영한다. 높이만큼 반복하면 해당 높이 변수를 1만큼 줄여 다음 방향으로 반복한다. 방향에 대한 부분은 1을 더하고 3을 나눈 나머지를 방향으로 정의해서 아까 정의한 dx, xy의 인덱스로 넣어 위치를 이동할 수 있도록 하는 것을 반복하면 n이 0이 되는 시점에 배열을 모두 채우고 순회가 종료된다.
42+
43+
마지막으로 각 배열을 뒤로 이어붙이면 문제에서 요구한 배열의 형태가 된다.
44+
45+
## Retrospective
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
function solution(n) {
2+
let dy = [1, 0, -1];
3+
let dx = [0, 1, -1];
4+
5+
let answer = [];
6+
let arr = new Array(n).fill().map((_, i) => new Array(i + 1));
7+
8+
let baseCount = 0;
9+
let direction = 0;
10+
11+
let y = -1;
12+
let x = 0;
13+
14+
while (n) {
15+
for (let i = 0; i < n; i++) {
16+
y += dy[direction];
17+
x += dx[direction];
18+
arr[y][x] = ++baseCount;
19+
}
20+
direction++;
21+
direction %= 3;
22+
n--;
23+
}
24+
25+
for (let i = 0; i < arr.length; i++) {
26+
for (let j = 0; j < arr[i].length; j++) {
27+
answer.push(arr[i][j]);
28+
}
29+
}
30+
return answer;
31+
}
32+
33+
test('Test case', () => {
34+
expect(solution(4)).toEqual([1, 2, 9, 3, 10, 8, 4, 5, 6, 7]);
35+
expect(solution(5)).toEqual([
36+
1,
37+
2,
38+
12,
39+
3,
40+
13,
41+
11,
42+
4,
43+
14,
44+
15,
45+
10,
46+
5,
47+
6,
48+
7,
49+
8,
50+
9,
51+
]);
52+
expect(solution(6)).toEqual([
53+
1,
54+
2,
55+
15,
56+
3,
57+
16,
58+
14,
59+
4,
60+
17,
61+
21,
62+
13,
63+
5,
64+
18,
65+
19,
66+
20,
67+
12,
68+
6,
69+
7,
70+
8,
71+
9,
72+
10,
73+
11,
74+
]);
75+
});

0 commit comments

Comments
 (0)