프로그래머스 L2 - 행렬 테두리 회전하기

이종호·2021년 7월 26일
0

알고리즘

목록 보기
10/10

문제

https://programmers.co.kr/learn/courses/30/lessons/77485?language=javascript

해결

function solution(r, c, queries) {
  var answer = [];
  let min = r*c + 1;

  let arr = [];
  let newArr = [];
  for (let i = 0; i < r; i++) {
    arr[i] = [];
    newArr[i] = [];
    for (let j = 0; j < c; j++) {
      arr[i][j] = i*c + j + 1;
      newArr[i][j] = i*c + j + 1;
    }
  }
  
  
  queries.forEach(query => {
    let [x1, y1, x2, y2] = query;
    x1--; y1--;x2--;y2--;
    for (let i = 0; i < r; i++) {
      for (let j = 0; j < c; j++) {
        // 좌 -> 우
        if(i === x1 && j >= y1 && j < y2) {
          newArr[i][j+1] = arr[i][j]
          if(arr[i][j] < min) min = arr[i][j];
        // 상 -> 하
        } else if(j === y2 && i >= x1 && i < x2){
          newArr[i+1][j] = arr[i][j];
          if(arr[i][j] < min) min = arr[i][j];
        // 우 -> 좌
        } else if(i === x2 && j >= y1+1 && j <= y2){
          newArr[i][j-1] = arr[i][j];
          if(arr[i][j] < min) min = arr[i][j];
        // 하 -> 상
        } else if(j === y1 && i >= x1+1 && i <= x2) {
          newArr[i-1][j] = arr[i][j]
          if(arr[i][j] < min) min = arr[i][j];
        // 그 외
        } else {
          newArr[i][j] = arr[i][j];
        }
      }
    }
    newArr.forEach((v, i) => {
      v.forEach((k, j) => {
        arr[i][j] = k
      })
    })

    answer.push(min);
    min = r*c + 1;
  })

  return answer;
}

풀이

  • 행렬 테두르의 범위를 지정한다.

  • 나 같은 경우, 좌 -> 우, 상 -> 하, 우 -> 좌, 하 -> 상 에 해당되는 범위를 if문으로 처리했다.

  • 그래서 값이 덮어씌워지지 않게 새로운 배열에 값을 넣고, 나중에 값을 복사하는 식으로 구현했다,

느낀점

  • 풀이는 나름 간단한 편이었다.
  • 하지만, 몇 가지 이유로 오랫동안 틀렸는데, 집중력이 많이 약해진거 같다..ㅜ
  • 다른사람 풀이를 보니 딱 한개의 값만 temp에 저장하고 하나씩 수정하는 식으로 구현했다.
function solution(rows, columns, queries) {
    const a = [...Array(rows)].map((_, r)=>[...Array(columns)].map((_, c)=>r*columns+c+1));
    const mins = [];

    queries.map(query => {
        const [x1, y1, x2, y2] = query.map(_=>_-1);
        let min = a[x1][y1], tmp = a[x1][y1];

        for(let i=x1;i<x2;i++) {
            a[i][y1] = a[i+1][y1];
            min = Math.min(min, a[i][y1]);
        }
        for(let i=y1;i<y2;i++) {
            a[x2][i] = a[x2][i+1];
            min = Math.min(min, a[x2][i]);
        }
        for(let i=x2;i>x1;i--) {
            a[i][y2] = a[i-1][y2];
            min = Math.min(min, a[i][y2]);
        }
        for(let i=y2;i>y1;i--) {
            a[x1][i] = a[x1][i-1];
            min = Math.min(min, a[x1][i]);
        }
        a[x1][y1+1] = tmp;

        mins.push(min);
    })

    return mins;
}
  • 조금 있다가 다시 이렇게 해봐야겠다.
profile
코딩은 해봐야 아는 것

0개의 댓글