[Programmers] n^2 배열 자르기 - JavaScript

Joosi_Cool·2023년 2월 15일
0

Programmers

목록 보기
21/98
post-thumbnail

문제설명



설계 과정

  1. 우선, n*n배열 생성
  2. 마지막 끝부터 num을 채워감.
  3. 배열을 2차원에서 하나로 합치기(flat 함수)
  4. 이를 left ~ right로 끊어서 return


오답 코드

function solution(n, left, right) {
    var answer = [];
    //0으로 된 배열 생성 [[0,0,0],[0,0,0],[0,0,0]]
    for(var i = 0;i<n;i++){
        answer.push(new Array(n).fill(0));
    }
    var first=0;
    var num =1;
    while(first!==n){
        //행 ++ 열 ++
        for(var i = n-1;i>=0;i--){
            answer[first][i] = num;
        }
        for(var i = n-1;i>=0;i--){
            answer[i][first] = num
        }
        first++;
        num++;
    }
    answer = answer.flat().slice(left,right+1); 
    return answer;
}


결과

결과는 참담했다... 실패 (signal: aborted (core dumped)) 이러한 오류는 처음 보았다. 이유가 while문 안에 여러개의 for문.... 벌써부터가 시간복잡도가 걱정된다. 그래서 위에 설계처럼 전부를 구한뒤, Left~Right를 뽑아내지말고 전부 구하는 과정 없이 left~right만을 구하기로 했다.



재설계 과정

ex) n = 4, left~right중 i 번째일때
몫이 0인 값은 1234
몫이 1인 값은 2234
몫이 2인 값은 3334
몫이 3인 값은 4444

  • 알아낸 규칙
    i%4를 했을때 i/4랑 비교해서 작거나 같으면 i/4를 넣고, 아니면 i%4+1넣어라.

결과 코드

function solution(n, left, right) {
    var answer = [];
    for (var i = left; i<=right;i++){
        if(i/n>=i%n){
            answer.push(Math.floor(i/n)+1);
        }
        else{
            answer.push(i%n+1);
        }
    }
    
    return answer;
}

결과

이번 문제는 모든 경우의 수를 다 구하지 않는 것이 중요했던 것 같다.
문제에서 말하고자 하는 규칙을 찾고 이를 이용하여 필요한 것만 간단하게 구해 내는것이 좋다, 이 말을 하고자 하는 문제인 것 같다.

profile
집돌이 FE개발자의 노트

0개의 댓글