function solution(rows, columns, queries) {
let answer = [];
let myArray = Array.from(new Array(rows), () => new Array(columns).fill(1))
.map((row, r) => row.map((v, c) => (r * columns) + (c + 1)));
for (let query of queries) {
let row1 = query[0]-1;
let col1 = query[1]-1;
let row2 = query[2]-1;
let col2 = query[3]-1;
let tmpArr = new Array();
for (let idx = col1; idx < col2; idx++) { tmpArr.push(myArray[row1][idx]); }
for (let idx = row1; idx < row2; idx++) { tmpArr.push(myArray[idx][col2]); }
for (let idx = col2; idx > col1; idx--) { tmpArr.push(myArray[row2][idx]); }
for (let idx = row2; idx > row1; idx--) { tmpArr.push(myArray[idx][col1]); }
tmpArr.unshift(tmpArr.pop());
let cnt = 0;
for (let idx = col1; idx < col2; idx++) { myArray[row1][idx] = tmpArr[cnt++]; }
for (let idx = row1; idx < row2; idx++) { myArray[idx][col2] = tmpArr[cnt++]; }
for (let idx = col2; idx > col1; idx--) { myArray[row2][idx] = tmpArr[cnt++]; }
for (let idx = row2; idx > row1; idx--) { myArray[idx][col1] = tmpArr[cnt++]; }
answer.push(Math.min(...tmpArr));
}
return answer;
}
rows x columns 크기인 행렬이 있습니다. 행렬에는 1부터 rows x columns까지의 숫자가 한 줄씩 순서대로 적혀있습니다.
이 행렬에서 직사각형 모양의 범위를 여러 번 선택해, 테두리 부분에 있는 숫자들을 시계방향으로 회전시키려 합니다. 각 회전은 (x1, y1, x2, y2)인 정수 4개로 표현합니다.
행렬의 rows, columns, 그리고 회전들의 목록[(x1, y1, x2, y2), ... ]이 주어질 때, 각 회전들을 행렬에 적용한 뒤, 그 회전에 의해 위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 넣어 return하는 문제입니다.
rows | columns | queries | result |
---|---|---|---|
6 | 6 | [[2,2,5,4],[3,3,6,6],[5,1,6,3]] | [8, 10, 25] |
문제 자체는 어렵지 않았으나, 배열 선언 및 초기화 과정에서 ES6 문법에 익숙해지고 또한 아름다운 코드를 짜보자는 욕심에 강아지 고생을 하게 되었습니다.
이를 오래 기억하며 더욱 학습하자는 의미로 포스팅합니다.
참고 사이트:
프로그래머스 - 행렬 테두리 회전하기