현인
[프로그래머스] 행렬 테두리 회전하기 with JS 본문
알고리즘 스프린트 13일차 - [프로그래머스] Lv 2. 행렬 테두리 회전하기
https://school.programmers.co.kr/learn/courses/30/lessons/77485
소요시간
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;
}
마치며
프로젝트 막바지라 바빠서 오랜만에 다시 알고리즘을 풀게 되었다. 배열 돌리기는 은근히 자주 출제되는 유형이라 복습도 할겸 찾아서 풀었는데, 오랜만이라 그런지 돌리는 방식이 낯설었다. 알고리즘도 확실히 익숙해져야 빠르게 코드를 작성할 수 있는 것 같다. 앞으로 다가올 코테들이 많은데 꾸준히 풀면서 폼을 올려야 겠다.
반응형
'알고리즘' 카테고리의 다른 글
[프로그래머스] 요격 시스템 with JavaScript (0) | 2023.09.04 |
---|---|
MST (0) | 2023.07.06 |
[프로그래머스] 튜플 with JS (0) | 2023.04.03 |
[프로그래머스] 코딩테스트 연습 with JS (0) | 2023.04.02 |
[프로그래머스] 징검다리 건너기 with JS (0) | 2023.04.02 |