티스토리 뷰
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
'알고리즘 > 문제 풀이' 카테고리의 다른 글
[BOJ] 백준 21866 - 추첨을 통해 커피를 받자 (Javascript, 2021 연세대학교 신입생 프로그래밍 경진대회) (0) | 2021.06.13 |
---|---|
[BOJ] 백준 21737 - SMUPC 계산기 (Javascript, 제 1회 SMUPC) (0) | 2021.05.12 |
[프로그래머스] 행렬 테두리 회전하기 (2021 Dev-Matching) (0) | 2021.05.02 |
[프로그래머스] 다단계 칫솔 판매 (2021 Dev-Matching) (0) | 2021.05.02 |
[프로그래머스] 삼각 달팽이 (월간 코드 챌린지 시즌 1) (0) | 2021.04.15 |
댓글