알고리즘/문제 풀이
[BOJ] 백준 16935 - 배열 돌리기 3 (Javascript)
degurii
2021. 5. 3. 20:58
728x90
문제 링크
풀이
귀찮은 구현 문제입니다. 자바스크립트로 풀었습니다.
이런 류의 문제에서는 구현해둔 함수를 이용하는 게 코드량을 줄이는 포인트입니다.
1) 상하 반전은 행의 순서를 reverse() 함수를 이용해 바꿔주면 됩니다.
2) 좌우 반전은 각 행마다 reverse() 함수를 적용하여 열의 순서를 바꿔줍니다.
3) 오른쪽 90도 회전을 열심히 구현합니다.
4) 왼쪽 90도 회전은 오른쪽 90도 회전을 세 번 한 것과 같습니다. 만들어둔 함수를 이용하면 쉽게 구현할 수 있습니다.
5) 사 등분 오른쪽 90도 회전을 열심히 구현합니다. 자바스크립트는 배열을 사 등분 해서 적당히 이어 붙여주는 방식으로 구현할 수 있습니다.
6) 사 등분 왼쪽 90도 회전은 5번 연산을 세 번 한 것과 같습니다.
자바스크립트는 마지막 정답 배열을 string으로 바꾸어 출력해줘야 하는 것에 주의합시다.
정답 코드
const fs = require('fs');
const stdin = fs.readFileSync('/dev/stdin').toString().split('\n');
const input = (() => {
let line = 0;
return () => stdin[line++];
})();
const main = function () {
const go = [
// 0번 연산은 없으므로 null로 채워줍시다.
null,
// 1번 연산: 상하 반전
board => [...board].reverse(),
// 2번 연산: 좌우 반전
board => board.map(row => [...row].reverse()),
// 3번 연산: 오른쪽 90도 회전
board => {
const n = board.length,
m = board[0].length;
const ret = Array.from(Array(m), () => new Array(n));
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
ret[i][j] = board[n - j - 1][i];
}
}
return ret;
},
// 4번 연산: 왼쪽 90도 회전
board => go[3](go[3](go[3](board))),
// 5번 연산: 사 등분 오른쪽 90도 회전
board => {
const n = board.length / 2,
m = board[0].length / 2;
const top = board.slice(0, n),
bottom = board.slice(n);
const part1 = top.map(row => row.slice(0, m)),
part2 = top.map(row => row.slice(m)),
part3 = bottom.map(row => row.slice(0, m)),
part4 = bottom.map(row => row.slice(m));
return [
...part3.map((row, i) => [...row, ...part1[i]]),
...part4.map((row, i) => [...row, ...part2[i]]),
];
},
// 6번 연산: 사 등분 왼쪽 90도 회전
board => go[5](go[5](go[5](board))),
];
const [n, m, r] = input().split(' ').map(Number);
const board = Array(n);
for (let i = 0; i < n; i++) {
board[i] = input().split(' ');
}
const commands = input().split(' ');
const ans = commands.reduce((ans, cmd) => go[cmd](ans), board);
const ansString = ans.reduce((str, row) => (str += row.join(' ') + '\n'), '');
console.log(ansString);
};
main();
728x90