본문 바로가기
CS/알고리즘

[월간 코드 챌린지 시즌3] PGS lv2. n^2 배열자르기

by westpearl 2025. 9. 8.
728x90
반응형
SMALL

1. 첫시도코드

/*
1. n행n열 nxn 크기의 비어있는 2차원 배열만들기
2. i=1,2,3,...,n 에 대해서, 다음과정반복
    - 1행1열부터 i행i열까지의 영역 내의 모든 빈 칸을 숫자i로 채움
*/

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

배열이 너무 길어져서 core dump가 뜸,, 

이 이후로 여러가지 도전을 해봤는데 계속 core dump가 뜸 애초에 2차원 배열arr를 만들지않고 풀어야하는것같은데,,, 
4시간도 못잔 내 머리로 못풀겠다.. 내일 재도전,,

 

2. 두번째시도 (25.09.14 일요일)

/*
1. n행n열 nxn 크기의 비어있는 2차원 배열만들기
2. i=1,2,3,...,n 에 대해서, 다음과정반복
    - 1행1열부터 i행i열까지의 영역 내의 모든 빈 칸을 숫자i로 채움
    
3. 2차원 배열로 안하고 처음부터 1차원배열로만들기
*/

function solution(n, left, right) {
    const arr = new Array(n*n).fill(1);
    let num = 1;
    for(let i=0;i<n;i++){
        num = (i+1);
        for(let j=0;j<n;j++){
            if(j<=i){
            arr[i*n + j] = num;   
            }else{
                arr[i*n+j] = num+(j-i);
            }
            
        }
    }
    
    
    return arr.slice(left,right+1) 
}

 

 

2차원 배열을 만들지 않고, 1차원배열로 배열을 만든뒤 slice,,,, 이것도 점수는 똑같이 나온다. 애초에 전체 순회를 하는게 문제인 듯 싶다. 

 

3. 세번째 시도 - 전체 배열 만들지않고, 해당되는 구간만 배열에 추가하기

/*
1. n행n열 nxn 크기의 비어있는 2차원 배열만들기
2. i=1,2,3,...,n 에 대해서, 다음과정반복
    - 1행1열부터 i행i열까지의 영역 내의 모든 빈 칸을 숫자i로 채움
    
3. 2차원 배열로 안하고 처음부터 1차원배열로만들기
*/

function solution(n, left, right) {
    const startRow = Math.floor(left/n);
    const startCol = left%n ;
    const endRow = Math.floor(right/n);
    const endCol = right%n;
    
    const arr = [];
   
    for(let i=startRow;i<=endRow;i++){
        for(let j=0;j<n;j++){
            if(i===startRow && j<startCol ){
                continue;
            }
            arr.push(Math.max(i,j)+1)
            if(i===endRow && j===endCol){
                break;
            }
        }
    }
    
    return arr; 
}

 

 

GPT 가 알려준 답 

function solution(n, left, right) {
  const answer = [];
  for (let k = left; k <= right; k++) {
    const row = Math.floor(k / n);
    const col = k % n;
    answer.push(Math.max(row, col) + 1);
  }
  return answer;
}

 

 

 

난 바보야~~~

LIST