알고리즘 문제 풀기

프로그래머스: 행렬 테두리 회전하기- javascript(그래프 회전)

Fo_rdang 2024. 4. 20. 11:31
반응형

문제 출처 

https://school.programmers.co.kr/learn/courses/30/lessons/77485

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 풀이 힌트 

01. 2차원 배열 생성 

02. 그 배열에다가 숫자를 1부터 차례대로 삽입 

03. 해당 사각형 범위에 있는 숫자들을 이동 순서(위, 오른쪽, 아래, 왼쪽)대로 stack에 넣는다 

- 여기서 제일 작은 값을 구할 것. 

- 이 값들을 이용해서 arr값을 채울 것. 

04. stack의 맨 뒤에 있는 값을 제일 앞으로 빼준다. (5번에서 arr 값 채울 건데 arr[x1][y1]의 값부터 채울거니까 그 이전값을 맨 앞으로 배치해야함)

05. arr에 차례대로 stack의 값을 채운다. 

문제 풀이 코드 

function solution(rows, columns, queries) {
    const answer = []; 
    //2차원 배열 생성한다. (헷갈리지 않게 idx를 1부터 세고 싶어서 가로세로 + 1씩함)
    let arr = Array.from(new Array(rows +1), () => new Array(columns + 1).fill(0))
    
    for(let i=1; i<=rows; i++){ //생성한 2차원 배열에다가 1부터 차례대로 값을 넣어줌
        for(let j=1; j<=columns; j++){
            arr[i][j] = (i-1) * columns +j
        }
    }
    
    for(let tc = 0; tc<queries.length; tc++){
        const [x1, y1, x2, y2] = queries[tc]; //x1 = 왼쪽 위 세로, y1=왼쪽 위 가로, x2=오른쪽 아래 세로, y2= 오른쪽 아래 가로
        const stack = []; 
        //현재 범위 내에 있는 모든 값들을 이동 순서대로 (위, 오른쪽, 아래, 왼쪽) stack에 넣는다. 
        for(let i= y1; i<y2; i++) stack.push(arr[x1][i]); //위
        for(let i= x1; i<x2; i++) stack.push(arr[i][y2]); //오른쪽
        for(let i= y2; i>y1; i--) stack.push(arr[x2][i]); //아래
        for(let i= x2; i>x1; i--) stack.push(arr[i][y1]); //왼쪽
        
        answer.push(Math.min(...stack)); //그 숫자들 중 가장 작은 값 answer에 push 
        const temp = stack.pop(); //arr[x1][y1]을 채울 값
        stack.unshift(temp);  //이 값을 stack 맨 앞에 세팅 (아래 반복문에서 arr[x1][y1]부터 채울것임)
        
        //arr에 값을 채운다. stack에 순서대로 값이 있음. 
        for(let i=y1; i<y2; i++) arr[x1][i] = stack.shift(); 
        for(let i=x1; i<x2; i++) arr[i][y2] = stack.shift(); 
        for(let i=y2; i>y1; i--) arr[x2][i] = stack.shift(); 
        for(let i=x2; i>x1; i--) arr[i][y1] = stack.shift(); 
    }
    return answer; 
}

Only 풀이 코드 

function solution(rows, columns, queries) {
    const answer = []; 
    let arr = Array.from(new Array(rows +1), () => new Array(columns + 1).fill(0))
    
    for(let i=1; i<=rows; i++){
        for(let j=1; j<=columns; j++){
            arr[i][j] = (i-1) * columns +j
        }
    }
    
    for(let tc = 0; tc<queries.length; tc++){
        const [x1, y1, x2, y2] = queries[tc]; 
        const stack = []; 
        for(let i= y1; i<y2; i++) stack.push(arr[x1][i]); 
        for(let i= x1; i<x2; i++) stack.push(arr[i][y2]); 
        for(let i= y2; i>y1; i--) stack.push(arr[x2][i]);
        for(let i= x2; i>x1; i--) stack.push(arr[i][y1]); 
        
        answer.push(Math.min(...stack)); 
        const temp = stack.pop(); 
        stack.unshift(temp); 
        
        for(let i=y1; i<y2; i++) arr[x1][i] = stack.shift(); 
        for(let i=x1; i<x2; i++) arr[i][y2] = stack.shift(); 
        for(let i=y2; i>y1; i--) arr[x2][i] = stack.shift(); 
        for(let i=x2; i>x1; i--) arr[i][y1] = stack.shift(); 
    }
    return answer; 
}

알고가는 ppoint

 

나의 틀린 풀이 코드 

function solution(rows, columns, queries) {
    let answer = []; 
    let graph = Array.from({length: rows}, () => new Array(columns).fill(0)); 
    for(let i=0; i<rows; i++){
        for(let j=0; j<columns;  j++){
            graph[i][j] = (i * columns + j+1)
        }
    }
    for(let query of queries){
        let [y1,x1,y2,x2] =  query.map(v=> v-1); 
        let temp1 = graph[y1][x1]; 
        let temp2 = graph[y1][x2]; 
        let temp3 = graph[y2][x1]; 
        let temp4 = graph[y2][x2]; 
        let min = Number.MAX_SAFE_INTEGER; 
            for(let j=columns; j>=0; j--){
                if(j >= x1 && j < x2){
                    graph[y1][j+1] = graph[y1][j]
                  if(min > graph[y1][j]) min = graph[y1][j]
            }
        }
            for(let j=0; j<columns; j++){
                if(j <= x2 && j > x1){
                    graph[y2][j] = graph[y2][j+1]
                    if(min > graph[y2][j+1]) min = graph[y2][j+1]
                }
            }
            for(let i=rows; i>=0; i--){
                if(i => y1 && i < y2){
                    graph[i+1][x2] = graph[i][x2]
                    if(min > graph[i][x2]) min = graph[i][x2]
                }
            }
            for(let i=0; i<=rows; i++){
                if(i <= y2 && i > y1 ){
                    graph[i+1][x1] = graph[i][x1]
                    if(min > graph[i][x1])  min = graph[i][x1]
                }
        }
         answer.push(min);        
    }
                return answer; 
}
//그림 확인 

//rows * columns (세로 (행), 가로(열))
//1~rows*colums 
//직사각형 범위 선택 후 테두리 부분 숫자를, 시계방향으로 회전
//중간 숫자는 회전 안함. 
//회전들 목록 queries
//return:위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 담아 

//2차원 배열 생성 및 숫자 채우기 
//queries에 따라 직사각형 확정 [5,1,6,3] 세로-1 가로-1, 세로-1 가로-1 =>  [4,0,5,2] y1,x1,y2,x2 
//직사각형에 따라 회전(대입) 
//- [4,0] => [4,1] 
//- [4,1] => [4,2]
//- [4,2] => [5,2]
//- [5,2] => [5,1]
//- [5,1] => [5,0]
//- [5,0] => [4,0]
// => 오른쪽이동, 아래 이동, 왼쪽 이동, 위로 이동 
// 01. 오른쪽_이동 if(y1이랑 같고, x1이상 & x2 미만)
// 02. 아래_이동  if(x2랑 같고, y1이상 & y2 미만)
// 03. 왼쪽_이동  if(y2랑 같고, x2이하 & x1 초과)
// 04. 위로_이동  if(x1랑 같고, y2이하 & y1 초과)
//그 숫자들 중 가장 작은거 answer에 push
반응형