본문 바로가기

알고리즘구현능력/문제해결능력

행렬 테두리 회전하기

1. 

1 2 3 

4 5 6

7 8 9

처럼 나오도록 행렬을 만든다.

2. 한바퀴를 돌면서 배열을 만든다.

3. 가져온 배열의 값중 최소값을 넣는다.. 혹시 마지막 반복이라면 굳이 다음 작없을 안해도 되므로 return시켜 종료해버린다.

4. 배열을 한칸씩 밀어낸다.

그리고 pop과 unshift를 통해서 한칸씩 밀어낸다.

pop은 맨 끝의 배열값을 가져오면서 제거하고

unshift는 배열의 첫번쨰에 값을 넣는 것이다.

5. 그러고 난 뒤 앞에서 반복햇던 반복을 조금 수정하여 한칸씩 밀린값을 대입한다.

//가장 작은 값 가져오는 거 ..
function solution(rows, columns, queries) {
    // ROW 행 column 렬
    let newArr = [];
    let count = 1;
    for(let i=0;i<rows;i++){
        newArr.push([]);
        for(let j=0;j<columns;j++){
            newArr[i][j] = count;
            count++;     
        }
    }
    
    let answer = []
    for(let i=0;i<queries.length;i++){
     let check = false;
     if(queries.length-1 ===i){
         check = true
     }
     const rotArr = rotationArr(newArr,answer,queries[i],check) ;
     if(check===false){
         rotationSetting(newArr, queries[i],rotArr);
     } 
    }
    return answer;
}

//오 아래 왼 위 거치는 숫자 가져오기..
function rotationArr(arr ,answer,query,check){
    let b = query[0]-1;
    let a = query[1]-1;
    let d = query[2]-1;
    let c = query[3]-1;
    let result = [];
    //(a,b) => (c,b) => (c,d) => (a,d) => (a,b)  
    
       //(a,b) => (c,b)  
    for(let i = a;i<c;i++){
      result.push(arr[b][i]);   
    }
    // (c,b) => (c,d)
    for(let i = b;i<d;i++){
      result.push(arr[i][c]);   
    }
   //(c,d) => (a,d)
    for(let i = c;i>a;i--){
      result.push(arr[d][i]);   
    }
    //(a,d) => (a,b)
    for(let i = d;i>b;i--){
      result.push(arr[i][a]);   
    }
   answer.push(Math.min(...result));
   if(check){
       return;
   }
   else{
       let temp = result.pop();
       result.unshift(temp); 
       return result;
   }
}

//한칸씩 밀어낸 배열을 가지고 기존 배열에 셋팅하는 작업..
function rotationSetting(arr,query,result){
    let b = query[0]-1;
    let a = query[1]-1;
    let d = query[2]-1;
    let c = query[3]-1;
    
        //(a,b) => (c,b)
    for(let i = a;i<c;i++){
      arr[b][i] = result.shift(); 
    }
    // (c,b) => (c,d)
    for(let i = b;i<d;i++){
      arr[i][c] = result.shift(); 
    }
     //(c,d) => (a,d)
    for(let i = c;i>a;i--){
      arr[d][i] = result.shift(); 
    }
     //(a,d) => (a,b)
    for(let i = d;i>b;i--){
       arr[i][a] = result.shift();  
    }
}