BOJ[16927] - 배열 돌리기 2 by JavaScript
배열 돌리기 2
문제
언어
- JavaScript
문제 풀이 step 1
- 구현 문제로서, 문제에서 주어진 설명대로 구현하는 문제입니다.
- 백준 16926번 - 배열 돌리기 1 풀이 와 완전 똑같은 방식으로 풀 수 있습니다.
- 따라서 본 포스트에는 풀이를 적지 않고, 소스 코드만 작성해놓았습니다.
소스 코드
const input = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\n");
class Queue {
constructor() {
this.bucket = [];
this.front = -1;
this.rear = -1;
}
isEmpty() {
return this.front === this.rear;
}
enqueue(data) {
this.bucket[++this.rear] = data;
}
dequeue() {
return this.bucket[++this.front];
}
size() {
return this.rear - this.front;
}
}
const rotate = (k, l, n, m, r, arr, resArr) => {
const queue = new Queue();
// 좌상단, 좌하단, 우상단, 우하단
let [ltx, lty] = [k, l];
let [lbx, lby] = [n - 1, l];
let [rtx, rty] = [k, m - 1];
let [rbx, rby] = [n - 1, m - 1];
// 그룹화
for (let i = lty; i < rty; i++) {
queue.enqueue(arr[ltx][i]);
}
for (let i = rtx; i < rbx; i++) {
queue.enqueue(arr[i][rty]);
}
for (let i = rby; i > lby; i--) {
queue.enqueue(arr[rbx][i]);
}
for (let i = lbx; i > ltx; i--) {
queue.enqueue(arr[i][lby]);
}
// 불필요한 회전수 제거
let count = r % queue.size();
// 회전
while (count-- > 0) {
queue.enqueue(queue.dequeue());
}
// 그룹을 다시 배열에 복사
for (let i = lty; i < rty; i++) {
arr[ltx][i] = queue.dequeue();
}
for (let i = rtx; i < rbx; i++) {
arr[i][rty] = queue.dequeue();
}
for (let i = rby; i > lby; i--) {
arr[rbx][i] = queue.dequeue();
}
for (let i = lbx; i > ltx; i--) {
arr[i][lby] = queue.dequeue();
}
};
const solution = (input) => {
let [n, m, r] = input[0].split(" ").map(Number);
let arr = input.slice(1, n + 1).map((v) => v.split(" ").map(Number));
let [k, l] = [0, 0];
const resArr = Array.from({length: n}, () => []);
while (n - k !== 0 && m - l !== 0) {
rotate(k, l, n, m, r, arr, resArr);
[k, l, n, m] = [k + 1, l + 1, n - 1, m - 1];
}
return arr.map((v) => v.join(" ")).join("\n");
};
console.log(solution(input));