[Algorithm] n^2 배열 자르기
공부

[Algorithm] n^2 배열 자르기

작성일: 2023년 10월 11일

문제설명

n^2 배열 자르기는 정수 n, right, left이 주어지고 n행 n열의 1부터 n까지 정수로 채워진 2차열 배열의 right ~ left까지의 1차원 배열을 반환하는 문제이다.

문제가 잘 이해되지 않았지만 시뮬레이션 그림을 보고 이해했다.

ex)

![](https://velog.velcdn.com/images/modac42asdfadsf/post/b3ec4cd7-388f-4277-a098-3904be0ab2d6/image.gif)

## 문제 해결
1. 배열을 직접 그려보니 반환해야 하는 배열 `[3,2,2,3]`2차원 배열의 인덱스 `[[0,2],[1,0],[1,1],[1,2]]`의 좌표를 지니고 있고 좌표 내에서 가장 큰 수에 1을 더한 값과 항상 같다는 점을 알아냈다.
2. 행은 2차원 배열에서 외부 배열의 인덱스, 열은 내부 배열의 인덱스이다.`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;

}