Level 2 ) n^2 배열 자르기 ⭐️

Doozuu·2023년 7월 28일
0

프로그래머스 (JS)

목록 보기
134/183

문제 설명

정수 n, left, right가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.

  1. n행 n열 크기의 비어있는 2차원 배열을 만듭니다.
  2. i = 1, 2, 3, ..., n에 대해서, 다음 과정을 반복합니다.
  3. 1행 1열부터 i행 i열까지의 영역 내의 모든 빈 칸을 숫자 i로 채웁니다.
  4. 1행, 2행, ..., n행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.

새로운 1차원 배열을 arr이라 할 때, arr[left], arr[left+1], ..., arr[right]만 남기고 나머지는 지웁니다.
정수 n, left, right가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.

제한사항

1 ≤ n ≤ 107
0 ≤ left ≤ right < n2
right - left < 105

입출력 예

n	left	right	result
3	2	5	[3,2,2,3]
4	7	14	[4,3,3,3,4,4,4,4]

풀이

  1. n행 n열 크기 배열 만들기
  2. i행 i열까지 i로 채워넣기
  3. 1차원 배열 만들기 -> arr.flat()
  4. left ~ right 까지만 남기기

-> 메모리 초과로 틀렸다.

function solution(n, left, right) {
    let arr = Array.from({length: n}, () => Array(n).fill(0));
    for(let i=0;i<n;i++){
        for(let j=0;j<=i;j++){
            arr[i][j] = i+1;
            if(i !== j) arr[j][i] = i+1;
        }
    }
    let arr1 = arr.flat();
    return arr1.slice(left, right+1);
}

틀린 이유

n의 범위는 10^7 이기 때문에 2차원 배열을 구현하고자 한다면 효율성 이전에 메모리문제(core dumped)가 발생하게 된다.

즉, left, right까지의 범위만을 고려해 1차원 배열로 풀어야 한다.

function solution(n, left, right) {
    if (n === 1){
        return left >= 1 ? [] : [1];
    }

    const answer = [];
    let rowCount = Math.floor(left / n) + 1; // 시작값이 있는 행

    for (let i = left; i < right + 1; i++) {
        // i+1이 n으로 나누어 떨어지면 바깥 테두리에 있는 것이므로 n을 담고 행 1추가
        if ((i + 1) % n === 0) {
            answer.push(n);
            rowCount += 1;
            continue;
        }
        if (i % n < rowCount){
            answer.push(rowCount);
        }else{
            answer.push((i + 1) % n);
        }
    }
    return answer;
}
function solution(n, left, right) {
    var answer = [];

    for (let i = left; i <= right; i++) {
        answer.push(Math.max(i % n, parseInt(i / n)) + 1)
    }

    return answer;
}
profile
모든게 새롭고 재밌는 프론트엔드 새싹

0개의 댓글