현인

[프로그래머스] 행렬 테두리 회전하기 with JS 본문

알고리즘

[프로그래머스] 행렬 테두리 회전하기 with JS

현인(Hyeon In) 2023. 4. 12. 20:07

알고리즘 스프린트 13일차 - [프로그래머스] Lv 2. 행렬 테두리 회전하기 

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

 

프로그래머스

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

programmers.co.kr

소요시간 

30분

계획

풀이

  • 배열 회전과 최솟값 구하기를 섞은 문제
  • 정해진 구간(x1,y1,x2,y2)의 정사각형의 테두리를 시계 방향으로 한 칸씩 회전 시키고
  • 회전한 값 중에 최솟값을 구해라
  • 회전 결과를 계속해서 반영해야 다음 회전 안에서 최솟값이 제대로 구해지는 것을 명심한다
  • 회전 하는 방법은 여러가지가 있으나, 내가 사용한 방법은 x,y 델타 값을 이용한 방법이다.
    • dx = [1,0,-1,0]
    • dy = [0,1,0,-1]
    • 위 처럼 델타 배열을 만들어준다.
    • 네 방향을 표현하는데, 순서는 시계 방향으로 회전시켜야 하므로
      • 아래
      • 오른쪽
      • 왼쪽
    • 순서로 진행된다
    • x1, y1에서 시작해서 next_x와 next_y를 구하는데
    • 방향에 맞는 다음 지점을 next_x와  next_y로 설정하고
      • 방향 벡터 dx,dy의 인덱스 값을 d로 설정한다.
      • next_x = before_x + dx[d]
      • next_y = before_y + dy[d]
    • next_x, next_y의 범위가 정해진 구역을 넘어가는 경우 다음 순서방향으로 다시 진행한다.
    • 방향이 총 4가지 이므로 while문은 d가 4 이상일 경우에 종료시킨다
      • 즉 d가 진행 방향을 뜻한다
      • d = 0 : 아래, d = 1 : 오른쪽, d = 2 : 위, d = 3 : 왼쪽

결과

코드

더보기
function rotate(query, arr){
    let minX = query[0]-1;
    let minY = query[1]-1;
    let maxX = query[2]-1;
    let maxY = query[3]-1;
    
    let dx = [1,0,-1,0];
    let dy = [0,1,0,-1];
    
    let d = 0;
    let before_x = minX;
    let before_y = minY;
    let min = arr[before_x][before_y];
    let first = arr[before_x][before_y];
    while(d < 4){
        let next_x = before_x + dx[d];
        let next_y = before_y + dy[d];
        if(next_x > maxX || next_x < minX || next_y > maxY || next_y < minY ){
            d++;
            continue;
        }
        arr[before_x][before_y] = arr[next_x][next_y];
        min = Math.min(arr[before_x][before_y], min);
        before_x = next_x;
        before_y = next_y;
        
    }
    arr[before_x][before_y + 1] = first;
    return min;
}

function solution(rows, columns, queries) {
    var answer = [];
    var arr = [];
    let num = 1;
    for(let i = 0; i < rows; i++){
        let temp = []
        for(let j = 0; j < columns; j++){
            temp.push(num);
            num++;
        }
        arr.push(temp);
    }
    queries.map((q) => {
        answer.push(rotate(q, arr))
    })
    
    return answer;
}

마치며

프로젝트 막바지라 바빠서 오랜만에 다시 알고리즘을 풀게 되었다. 배열 돌리기는 은근히 자주 출제되는 유형이라 복습도 할겸 찾아서 풀었는데, 오랜만이라 그런지 돌리는 방식이 낯설었다. 알고리즘도 확실히 익숙해져야 빠르게 코드를 작성할 수 있는 것 같다. 앞으로 다가올 코테들이 많은데 꾸준히 풀면서 폼을 올려야 겠다.

반응형