function solution(n, left, right) {
// const answer = Array(n).fill(Array(n).fill(0));
const answer = Array.from(Array(n), () => Array(n).fill(0));
for (let row = 0; row < n; row++) {
for (let column = 0; column < n; column++) {
answer[row][column] = Math.max(row, column) + 1;
}
}
const flatAnswer = answer.reduce((x, y) => [...x, ...y]);
return flatAnswer.slice(left, right + 1);
}
문제에서 시키는 그대로 작성했습니다. 하지만 숫자 범위가 너무 커서 메모리 초과, 시간 초과 오류가 발생했습니다. 위의 코드를 작성하면서 배운 것들만 정리하고 정답 코드를 살펴보려고 합니다.
1. 2차원 배열 초기화
const answer = Array(n).fill(Array(n).fill(0));
처음에는 위와 같이 배열을 초기화 해주었습니다. 하지만 Array(n).fill(0)로 2차원 배열을 채울 때, 전부 같은 배열 취급이 되어서 값이 동시에 바뀌는 문제가 있었습니다. 각자 새로운 배열로 채워서 초기화 하고 싶을 때에는
Array.from(Array(n), () => Array(n).fill(0));
위와 같이 Array.from을 사용하면 됩니다.
Array(n) -> n개의 값을 갖는 배열을 하나 생성합니다.
() => Array(n).fill(0) -> 각 원소를 n개의 0값을 갖는 배열로 채웁니다.
각 배열 마다 새로 생성되므로 다른 배열 취급이 됩니다.
2. 2차원 배열 1차원 배열로
concat을 이용하는 방법, flat을 이용한 방법이 있지만 reduce를 사용한 배열 스프레드로 2차원 배열을 1차원 배열로 바꾸어 주었습니다.
function solution(n, left, right) {
const answer = [];
for (let i = left; i <= right; i ++) {
answer.push(Math.max(Math.floor(i / n), i % n) + 1);
}
return answer;
}
정답 코드입니다. 문제의 조건 범위가 너무 크기때문에 문제 그대로 구현하면 오류가 발생합니다. 위와 같이 규칙을 찾아서 구현해야 통과가 됩니다.
위를 활용해서 정답을 구하면 쉽게 구할 수 있습니다.