반복문을 어떻게 돌려야 할지 고민을 많이 했던 문제이다
처음에는 각각의 x,y좌표를 for문 내에서 변경하면서 작동시켰으나 많은 오류들이 발생하였다
다른 방법을 고민하다 삼각형의 한변의 길이가
n = 6 이면 5 -> 2 로 줄어들고, n = 5 이면 4 -> 1 로 줄어드는 것을 알아냈다
이를 반복 횟수로 활용하여 코드를 작성하였다
삼각형 3변을 움직여야 하기에 while문 안에 반복문이 3개가 들어가 있으며 while문 탈출은 사각형의 개수만큼 반복하는 것이다
👇 해결 코드는 다음과 같다
function solution(n) {
var answer = [];
let arrays = new Array(n), sum = 0;
// 0으로 채워진 피라미드 배열을 만들면서
// 최종적으로 필요한 사각형의 수를 구한다
for(let i = 0 ; i < arrays.length ; i++){
arrays[i] = new Array(i+1).fill(0);
sum += i+1;
}
// 사각형의 개수를 셀 num과
// 반복 횟수, x,y좌표를 초기화한다
let num =1;
let repeat = n-1, x = 0 , y = 0;
// 총 사각형의 수만큼 반복을 진행
while(num < sum){
// 삼각형의 좌변 채우기
for(let k = 0 ; k < repeat ; k++){
arrays[x][y] = num;
if(num === sum )
break;
num ++;
x++;
}
// 삼각형의 밑변 채우기
for(let k = 0 ; k < repeat ; k++){
arrays[x][y] = num;
if(num === sum)
break;
num++;
y++;
}
// 삼각형의 우변 채우기
for(let k =0 ; k < repeat ; k++){
arrays[x][y] = num;
if(num === sum )
break;
num++;
y--;
x--;
}
y+=1;
x+= 2;
repeat -=3;
// 반복이 0이면 사각형 하나가 남음
if(repeat === 0){
arrays[x][y] =num;
}
}
// 1이 주어지면 위의 while문이 실행안되므로
// 이에 대한 예외처리
if(num ===1)
arrays[x][y] = 1
// 배열 펼치기~!!!
return arrays.flat();;
}
삼각형으로 채워지는 것이기 때문에, 3변을 순회해야 하므로 3번의 반복을 한세트로 묶어서 진행하면 된다.
또한 x--, y--에 대한 특성을 활용해 해당 증감식 자체를 배열안에 넣어줌으로써 코드를 더 최소화 할 수 있다
최종 코드는 아래와 같다.👇
function solution(n) {
const arrays = new Array(n).fill().map((_, index) => new Array(index + 1));
let row = 0;
let col = -1;
let count = 1;
//삼각형은 3변이므로!
for (let i = n; i > 0; i -= 3) {
// 왼쪽 -> 아래 -> 오른쪽 탐색
for (let j = 0; j < i; j += 1) arrays[++col][row] = count++;
for (let j = 0; j < i - 1; j += 1) arrays[col][++row] = count++;
for (let j = 0; j < i - 2; j += 1) arrays[--col][--row] = count++;
}
return arrays.flat();
}
x,y에 대한 변수명을 의미있는 네이밍인 col, row로 바꾸면서 코드를 작성하였다.