function solution(n) {
// 삼각형을 표현할 2차원 배열 생성
const triangle = Array.from({ length: n }, (_, i) => Array(i + 1).fill(0));
let num = 1; // 채워야 할 숫자
let x = -1, y = 0; // 시작 위치
let direction = 0; // 초기 방향: 아래 (0: 아래, 1: 오른쪽, 2: 왼쪽 위)
// n번 반복하며 삼각형을 채움
for (let i = 0; i < n; i++) {
for (let j = i; j < n; j++) {
if (direction % 3 === 0) { // 아래 방향
x++;
} else if (direction % 3 === 1) { // 오른쪽 방향
y++;
} else if (direction % 3 === 2) { // 왼쪽 위 방향
x--;
y--;
}
triangle[x][y] = num++;
}
direction++; // 방향 전환
}
// 2차원 배열을 1차원 배열로 변환하여 반환
return triangle.flat();
}
console.log(solution(4)); // [1,2,9,3,10,8,4,5,6,7]
console.log(solution(5)); // [1,2,12,3,13,11,4,14,15,10,5,6,7,8,9]
console.log(solution(6)); // [1,2,15,3,16,14,4,17,21,13,5,18,19,20,12,6,7,8,9,10,11]
// function solution(n) {
// const answer=[];
// const resultArray=Array.from({length:n},()=>[]);
// // 한 줄 아래로 내려가거나, 오른쪽으로 이동하거나, 한 줄 위로 올라가고 왼쪽으로 이동하거나
// const directions=[[1,0],[0,1],[-1,-1]];
// // for문을 보면 첫 row에는 무족너 +1이 되도록 되어 있음. 따라서 -1로 선언해주어야 resultArray[0][0]부터 시작이 가능하다.
// let row=-1;
// let col=0;
// let count=1;
// let currentDirectionIndex=0;
// // i를 n부터 n-1, n-2, ..., 2, 1로 하나씩 줄여가는 이유는
// // 행 값만 증가하는 경우, 열 값만 증가하는 경우, 행과 열 값이 감소하는 경우가 한 개씩 줄어들기 때문이다.
// for (let i=n;i>0;i-=1){
// const [nextRow,nextColumn]=directions[currentDirectionIndex];
// for (let j=0;j<i;j+=1){
// row+=nextRow;
// col+=nextColumn;
// resultArray[row][col]=count;
// count+=1;
// }
// currentDirectionIndex=(currentDirectionIndex+1)%3;
// }
// resultArray.map((el)=>answer.push(...el));
// return answer;
// }
첫번째 풀이는 챗지피티
두 번째 풀이는
https://velog.io/@young_pallete/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%82%BC%EA%B0%81-%EB%8B%AC%ED%8C%BD%EC%9D%B4-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8
내 코드 설명
[2,9]는 [2,12]가 되고 그 다음은 [2,15]이 되고.
[3,10,8]은 [3,13,11]이 되고 그 다음은 [3,16,14]가 된다.
이걸 활용해서 풀고 싶었는데 실패했다.
방향을 꺾는 식으로는 문제를 풀고 싶지 않았다. 꺾는 지점을 계산하는 것이 복잡해 보였기 때문이다.
그런데 답지를 보니 방향 배열([[1,0],[0,1],[-1,-1]])을 선언해주면 각각의 배열이 연속으로 몇 번 사용되는지 확인해주면 이 문제는 간단하게 풀렸다.
Array 인스턴스의 flat() 메서드는 모든 하위 배열 요소가 지정된 깊이까지 재귀적으로 연결된 새 배열을 생성한다.
설명은 어려운데 예시를 보면 이해가 쉽다. 말 그대로 배열의 깊이를 평탄화하는 것이다.
믈론 기본값은 1이라서 따로 값을 지정해주지 않는 한 한 단계씩 평탄화한다.
const arr1=[0,1,2,[3,4]];
console.log(arr1.flat()); --> Array [0,1,2,3,4]
const arr2=[0,1,[2,[3,[4,5]]];
console.log(arr2.flat()); --> Array [0, 1, 2, Array [3, Array [4,5]]]
console.log(arr2.flat(2)); --> Array [0,1,2,3, Array[4,5]]
console.log(arr2.flat(3)); --> Array [0,1,2,3,4,5]
메서드 안에는 숫자 말고도 Infinity를 넣어서 무조건 일차원 배열로 만들 수도 있다.
console.log(arr2.flat(Infinity)); --> Array [0, 1, 2,3, 4,5]
이걸 이제서야 알았다니.
[출처] https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/flat