일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 자바스크립트코딩테스트
- HTML
- CSS
- stack문제
- next13
- 자바스크립트 알고리즘
- til
- Baekjoon
- 자바스크립트 연결리스트
- Next.js13
- 리액트
- NPM
- 타입스크립트
- leetcode
- lodash
- react
- 자바스크립트
- 알고리즘문제풀이
- Next
- 자바스크립트 알고리즘 문제
- 리액트쿼리
- 제로베이스
- 자바스크립트 문제
- 자바스크립트 문제풀이
- leetcode문제풀이
- 프론트엔드
- JavaScript
- 자바스크립트 문제 풀이
- 프로그래머스
- JS
- Today
- Total
코드노트
자바스크립트 달팽이 배열 문제 풀이 본문
자바스크립트 달팽이 배열 문제..
처음에는 풀이를 보면서도 이해가 잘 되지 않았다.
unshift, push를 사용해야하는건가? 라는 생각을 했지만
2차원배열을 추가한 후 x, y를 통해서 배열을 가르키는 인덱스 번호를 수정하면서 숫자를 넣어주면 되는 거였다.
나중에 다시 기억을 살릴수 있도록 기록해보려고 한다..
달팽이 배열 풀이 코드
let result = [];
// 1. result => 2차원 배열
for (let i = 0; i < length; i++) {
result[i] = [];
}
/** 2.패턴 기반으로 반복문 구현
* 1) length 길이만큼 시작해서 숫자를 채운다.
* 2) length = i만큼 줄어들고, 방향도 바뀌면서, 2회씩 출력한다.
* 3) length == 0; 프로그램을 멈춘다.
*/
let direction = 1;
let x, y, num;
x = y = num = 0;
x--;
while (true) {
for (let i = 0; i < length; i++) {
x += direction;
result[y][x] = ++num;
}
length--;
if (length <= 0) break;
for (let j = 0; j < length; j++) {
y += direction;
result[y][x] = ++num;
}
direction *= -1;
}
return result;
- 이해하기가 어려울 수도 있으니 코드를 잘라가면서 설명란을 붙혀보겠다!
for (let i = 0; i < length; i++) {
result[i] = [];
}
- 배열을 우선 2차원 배열로 넣어준다.
- length 값에 맞게 배열을 추가!
let direction = 1;
let x, y, num;
x = y = num = 0;
x--;
- 변수는 이렇게 4가지를 추가한다.
- direction은 현재 1이지만
끝부분에서는 값을 -1을 곱해주면서
인덱스 값을 앞으로 추가하거나 뒤로 추가할 수 있도록 한다.
while (true) {
for (let i = 0; i < length; i++) {
x += direction;
result[y][x] = ++num;
}
length--;
if (length <= 0) break;
- while 문으로 반복을 돌려주면서 length 값을 하나씩 줄여나간다.
( 달팽이 모양을 만들면서 숫자를 입력하면 각 행과, 열에 넣을 수 있는 수는 짝수만큼 줄어든다.)
ex) 5를 입력하면 가로 1, 2, 3, 4, 5 // 세로 6, 7, 8, 9 // 가로 10, 11, 12, 13 // 세로 14, 15, 16 // 가로 17, 18, 19 ...
- x += directrion;
[y] [x] 중에서 x값을 length(5)만큼 늘려준다.
result [y] [x]의 x값을 ++하면서 result [0][0], [0][1], [0][2], [0][3], [0][4] 까지 1, 2, 3, 4, 5 를 넣는다.
- length--;
이제 여기서 length 값을 5에서 4로 줄여준다. 이렇게 length 값이 0이 될때까지 돌아준다고 보면된다.
for (let j = 0; j < length; j++) {
y += direction;
result[y][x] = ++num;
}
direction *= -1;
}
- 현재 값 [0][0], [0][1], [0][2], [0][3], [0][4]으로 [ 1, 2, 3, 4, 5 ]
- 이제 y값을 + 올려준다. 현재 result [y][x]의 값은 [0][4]이다.
- [1][4], [2][4], [3][4], [4][4] 인덱스에 6, 7, 8, 9를 넣어준다.
※현재 입력 된 값
[0][0], [0][1], [0][2], [0][3], [0][4]
[ ][ ], [ ][ ], [ ][ ], [ ][ ], [1][4],
[ ][ ], [ ][ ], [ ][ ], [ ][ ], [2][4],
[ ][ ], [ ][ ], [ ][ ], [ ][ ], [3][4],
[ ][ ], [ ][ ], [ ][ ], [ ][ ], [4][4],
- 여기서 directrion에서 -1을 곱한값을 넣어준다.
그럼 다시 처음부터 올라가게 된다.
while (true) {
for (let i = 0; i < length; i++) {
x += direction;
result[y][x] = ++num;
}
length--;
if (length <= 0) break;
- 여기서 result [y][x]의 값은 [4][4]이다.
- direction = -1을 계속 추가한다.
- [4][3], [4][2], [4][1], [4][0] 인덱스에 13, 12, 11, 10를 넣어준다.
※현재 입력 된 값
[0][0], [0][1], [0][2], [0][3], [0][4]
[ ][ ], [ ][ ], [ ][ ], [ ][ ], [1][4],
[ ][ ], [ ][ ], [ ][ ], [ ][ ], [2][4],
[ ][ ], [ ][ ], [ ][ ], [ ][ ], [3][4],
[4][0], [4][1], [4][2], [4][3], [4][4],
이렇게 계속 반복하면서 위로 올라가고 옆으로가고 방향을 바꾸는건 인덱스 값이 바뀌면서 입력값을 올리는거였다.
처음에 이게 이해가 안되었다. 어떻게 x, y로 가로열 세로열이 들어가지지?
이제 이해할 수 있었다!
혹시나 이해를 못하는 분들이 있다면 이해를 할 수 있는 글이 되었으면 한다..!!
달팽이 문제만 이해하고 푸는데 하루가 걸렸다..ㅠㅠ
'Code note > 자바스크립트 알고리즘 문제풀이' 카테고리의 다른 글
코딩테스트 연습 - 올바른 괄호 (0) | 2022.08.30 |
---|---|
코딩테스트 연습 - 같은숫자는 싫어 (0) | 2022.08.30 |
자바스크립트 배열 문제 풀이 - 숫자 빈도수 구하기 (0) | 2022.08.24 |
자바스크립트 배열 문제 풀이 - 높이 맞추기 / 배열 평균에 맞추기 (0) | 2022.08.23 |
자바스크립트 배열 문제 풀이 - 문제점수 채점, 가산점 계산 (0) | 2022.08.23 |