n^2 배열 자르기는 정수 n, right, left이 주어지고 n행 n열의 1부터 n까지 정수로 채워진 2차열 배열의 right ~ left까지의 1차원 배열을 반환하는 문제이다.
문제가 잘 이해되지 않았지만 시뮬레이션 그림을 보고 이해했다.
ex)
n = 3 | left = 2 | right = 5 => [3,2,2,3]
[3,2,2,3]
는 2차원 배열의 인덱스 [[0,2],[1,0],[1,1],[1,2]]
의 좌표를 지니고 있고 좌표 내에서 가장 큰 수에 1을 더한 값과 항상 같다는 점을 알아냈다.left ~ right
까지의 인덱스를 index
, 산출할 결과는 num
이라고 가정하고 (행, 열) => (x, y)
로 대입했을 때 아래와 같은 공식이 나온다.let x = Math.floor(index / n)
// 인덱스를 주어진 n으로 나누고 내림 => 행
let y = index % n
// 인덱스를 주어진 n으로 나머지 연산 => 열
let num = Math.max(x, y) + 1
// 구하고자 하는 값 = 행과 열 중 가장 큰 값에 1을 더한다.
알아낸 공식을 대입하니 반복문을 통해 반환할 배열에 값을 넣어주기만 하면 되는 간단한 문제였다. 힌트를 찾아봤지만 봐도 이해가 되지 않아 그려서 직접 대입해보니 그제서야 깨달은 공식이다.
function solution(n, left, right) {
const arr = [];
for (let i = left; i <= right; i++) {
let x = Math.floor(i/n),
y = i%n;
arr.push(Math.max(x,y)+ 1)
}
return arr;
}