알고리즘/문제 풀이

[BOJ] 백준 16935 - 배열 돌리기 3 (Javascript)

degurii 2021. 5. 3. 20:58
728x90

문제 링크

www.acmicpc.net/problem/16935

 

16935번: 배열 돌리기 3

크기가 N×M인 배열이 있을 때, 배열에 연산을 R번 적용하려고 한다. 연산은 총 6가지가 있다. 1번 연산은 배열을 상하 반전시키는 연산이다. 1 6 2 9 8 4 → 4 2 9 3 1 8 7 2 6 9 8 2 → 9 2 3 6 1 5 1 8 3 4 2 9 →

www.acmicpc.net

 

풀이

귀찮은 구현 문제입니다. 자바스크립트로 풀었습니다.

이런 류의 문제에서는 구현해둔 함수를 이용하는 게 코드량을 줄이는 포인트입니다.

 

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