Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
Tags
- 백준알고리즘
- 다이나믹프로그래밍
- 코딩테스트
- 프로그래머스코테
- css기초
- HTML5
- JS프로그래머스
- js코테
- 백준
- HTML
- 프로그래머스
- 알고리즘
- 백준구현문제
- CSS
- 안드로이드 스튜디오
- 코테
- 리액트
- 자바스크립트
- 백준js
- 백준nodejs
- 백준골드
- 리액트커뮤니티
- JS
- 포이마웹
- 리액트댓글기능
- 몽고DB
- 백준구현
- 익스프레스
- 프로그래머스JS
- dp알고리즘
Archives
- Today
- Total
개발새발 로그
[JS] 행렬 테두리 회전하기 본문
행렬 테두리 회전하기
rows x columns 크기인 행렬이 있습니다. 행렬에는 1부터 rows x columns까지의 숫자가 한 줄씩 순서대로 적혀있습니다. 이 행렬에서 직사각형 모양의 범위를 여러 번 선택해, 테두리 부분에 있는 숫자들을 시계방향으로 회전시키려 합니다. 각 회전은 (x1, y1, x2, y2)인 정수 4개로 표현하며, 그 의미는 다음과 같습니다.
- x1 행 y1 열부터 x2 행 y2 열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한 칸씩 시계방향으로 회전합니다.
다음은 6 x 6 크기 행렬의 예시입니다.
![](https://blog.kakaocdn.net/dn/xuCQV/btsjjBBtkiX/oe4KErkKpHk4gKV8RkyGvK/img.png)
이 행렬에 (2, 2, 5, 4) 회전을 적용하면, 아래 그림과 같이 2행 2열부터 5행 4열까지 영역의 테두리가 시계방향으로 회전합니다. 이때, 중앙의 15와 21이 있는 영역은 회전하지 않는 것을 주의하세요.
![](https://blog.kakaocdn.net/dn/zqz7M/btsjj9dYCrw/6kYcsNQUbBkgZlq1wOfiw1/img.png)
행렬의 세로 길이(행 개수) rows, 가로 길이(열 개수) columns, 그리고 회전들의 목록 queries가 주어질 때, 각 회전들을 배열에 적용한 뒤, 그 회전에 의해 위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 담아 return 하도록 solution 함수를 완성해주세요.
제한사항
- rows는 2 이상 100 이하인 자연수입니다.
- columns는 2 이상 100 이하인 자연수입니다.
- 처음에 행렬에는 가로 방향으로 숫자가 1부터 하나씩 증가하면서 적혀있습니다.
- 즉, 아무 회전도 하지 않았을 때, i 행 j 열에 있는 숫자는 ((i-1) x columns + j)입니다.
- queries의 행의 개수(회전의 개수)는 1 이상 10,000 이하입니다.
- queries의 각 행은 4개의 정수 [x1, y1, x2, y2]입니다.
- x1 행 y1 열부터 x2 행 y2 열까지 영역의 테두리를 시계방향으로 회전한다는 뜻입니다.
- 1 ≤ x1 < x2 ≤ rows, 1 ≤ y1 < y2 ≤ columns입니다.
- 모든 회전은 순서대로 이루어집니다.
- 예를 들어, 두 번째 회전에 대한 답은 첫 번째 회전을 실행한 다음, 그 상태에서 두 번째 회전을 실행했을 때 이동한 숫자 중 최솟값을 구하면 됩니다.
입출력 예시rowscolumnsqueriesresult
6 | 6 | [[2,2,5,4],[3,3,6,6],[5,1,6,3]] | [8, 10, 25] |
3 | 3 | [[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]] | [1, 1, 5, 3] |
100 | 97 | [[1,1,100,97]] | [1] |
입출력 예 설명
입출력 예 #1
- 회전을 수행하는 과정을 그림으로 표현하면 다음과 같습니다.
입출력 예 #2
- 회전을 수행하는 과정을 그림으로 표현하면 다음과 같습니다.
입출력 예 #3
- 이 예시에서는 행렬의 테두리에 위치한 모든 칸들이 움직입니다. 따라서, 행렬의 테두리에 있는 수 중 가장 작은 숫자인 1이 바로 답이 됩니다.
풀이방법
1. 1부터 증가하는 배열 초기화해준다.
2. forEach로 순회한다.
3.그림과 같이 반복문을 4개 돌린다.
4. 처음에는 큐에 넣으면서 반복한다.
5.그리고 큐 맨 뒤에 숫자를 앞에 unshift한다.
6.큐안에서 가장 작은 값을 빼서 정답배열에 넣는다.
7. 바꾼 큐값을 다시 순서대로 넣으면 한번 회전한 행렬이 된다.
function solution(rows, columns, queries) {
var answer = [];
let arr = Array.from({length:rows},()=>Array(columns).fill(0))
let a=0;
for(var i=0;i<rows;i++){
for(var j=0;j<columns;j++){
arr[i][j]=++a;
}
}
let queue=[];
queries.forEach(query => {
const [x1, y1, x2, y2] = query.map(x => x - 1) //0,0부터 시작해야되니까
const queue = []
for (let i = 0; i < y2 - y1; i++) queue.push(arr[x1][y1 + i])
for (let i = 0; i < x2 - x1; i++) queue.push(arr[x1 + i][y2])
for (let i = 0; i < y2 - y1; i++) queue.push(arr[x2][y2 - i])
for (let i = 0; i < x2 - x1; i++) queue.push(arr[x2 - i][y1])
queue.unshift(queue.pop()) //뒤에것이 앞으로 가면서 다시 순서대로 넣으면 한번 회전한 꼴이된다.
answer.push(Math.min(...queue))
for (let i = 0; i < y2 - y1; i++) arr[x1][y1 + i] = queue.shift()
for (let i = 0; i < x2 - x1; i++) arr[x1 + i][y2] = queue.shift()
for (let i = 0; i < y2 - y1; i++) arr[x2][y2 - i] = queue.shift()
for (let i = 0; i < x2 - x1; i++) arr[x2 - i][y1] = queue.shift()
})
return answer;
}
728x90
반응형
LIST