[Algorithm] n^2 배열 자르기

MODAC·2023년 10월 11일
0

Algorihtm

목록 보기
9/12
post-thumbnail

문제설명

n^2 배열 자르기는 정수 n, right, left이 주어지고 n행 n열의 1부터 n까지 정수로 채워진 2차열 배열의 right ~ left까지의 1차원 배열을 반환하는 문제이다.
문제가 잘 이해되지 않았지만 시뮬레이션 그림을 보고 이해했다.
ex)
n = 3 | left = 2 | right = 5 => [3,2,2,3]

문제 해결

  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;
}

0개의 댓글