처리 조건
풀이
달팽이가 위에서부터 도는 모양을 생각해보자
위에서부터 n만큼 내려가고 n-1만큼 오른쪽으로가고 n-2만큼 위로 다시 올라가며 빙글빙글 돌게된다.
반복없이 여기까지만 구해본다면 맨위부터 n만큼 배열을 만들어 내부에서 일치하는 인덱스에 값을 담아줘야한다.
count는 들어갈 숫자로 0부터 시작하게되며 x=-1 y=0으로 왼쪽부터 대각선으로 내려가는 for문을 돌린다.
0부터 4전까지 x축을올리며 count를 올리며 할당해준다. 맨아래에서 오른쪽으로 가는 for문을 돌린다. n-1인 0부터 3전까지 돌리게 되며 x는 그대로두고 y축을 +1해주면서 count++를 하며 값을 저장시킨다. 오른쪽 위로 진행되는 대각선 for문을 돌린다. n-2인 0부터 2까지 돌리게되며 x와y축 둘다 -하며 count++를 하며 값을 저장시킨다.
여기까지 돌리게 되면 바깥을 한번 빙빙 돌았지만 안에는 못돌았다 그래서 아래처럼 값이 나온다
x자리에 10까지 들어가야한다. 이제 전체를 while문을 돌릴 것이고 다음 안쪽에서 빙글빙글 돌 로직을 짜주어야한다.
n을 변화를 줄건데 -3을 빼주면된다. 그이유는 n만큼 처음 한바퀴를 돌고나면 안에서는 -3만큼 인 n까지 for문을 돌리면 되는데
이렇게 -3인만큼 횟수가 움직이기 때문이다. n이 4일때 우리는 왼쪽면 대각선을 구할때 n을 4전까지 돌렸고. 즉 for문으로 i는 3까지 그리고 안에 있는 면이 1개만 만든다면 for문의 i가 0까지 이므로 n-3을 해준값을 n에다가 넣어주면 된다.
while문은 n이 1이상일때까지만 돌아가게 된다. 0이면 for문안에서 let i=0 이 i<0까지 이니 작동안하고 작동시킬 필요도 없으니까!
function solution(n) {
const answer = new Array(n).fill().map((_, index) => {
return new Array(index + 1)
});
let count = 0;
let x = -1;
let y = 0;
while (n > 0) {
for (let i = 0; i < n; i++) answer[++x][y] = ++count;
for (let i = 0; i < n - 1; i++) answer[x][++y] = ++count;
for (let i = 0; i < n - 2; i++) answer[--x][--y] = ++count;
n -= 4;
}
return answer.flatMap((e) => e);
}
'일반 학습 > 코딩 테스트' 카테고리의 다른 글
우선권에 따라 선수 데려가기 (0) | 2022.03.27 |
---|---|
[프로그래머스] 2개 이하로 다른 비트 (0) | 2022.03.25 |
[프로그래머스] 피로도 (0) | 2022.03.25 |
[프로그래머스] 큰 수 만들기 (0) | 2022.03.24 |
[프로그래머스] 카펫 (0) | 2022.03.24 |
댓글