[JS]n^2 배열 자르기

DARTZ·2023년 6월 3일
0

알고리즘

목록 보기
117/135

문제

처음 코드

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

정답 코드입니다. 문제의 조건 범위가 너무 크기때문에 문제 그대로 구현하면 오류가 발생합니다. 위와 같이 규칙을 찾아서 구현해야 통과가 됩니다.

규칙

  • 각 배열의 위치의 값은 행이나 열 숫자 중 큰 값을 가집니다. (배열때문에 0부터 시작하므로 + 1)
  • 1차원 배열을 2차원 배열로 바꾸었을 때, 행의 위치는 i / n이 됩니다.
  • 1차원 배열을 2차원 배열로 바꾸었을 때, 열의 위치는 i % n이 됩니다.

위를 활용해서 정답을 구하면 쉽게 구할 수 있습니다.

profile
사람들이 비용을 지불하고 사용할 만큼 가치를 주는 서비스를 만들고 싶습니다.

0개의 댓글