
T개의 톱니바퀴가 있다. 그 중 한개의 톱니바퀴를 시계 또는 반시계 방향으로 돌릴 때
인접한 두개의 톱니바퀴의 인접한 부분의 극의 따라 다른 톱니바퀴도 연쇄적으로 움직인다.
톱니 바퀴는 아래와 같은 규칙으로 움직인다.
입력으로 주어진만큼 회전을 진행한 후에 12시 톱니가 S극인 톱니바퀴의 갯수를 구하여라.
이 문제는 이전에 풀었던 톱니바퀴 문제와 거의 완벽하게 똑같은 문제이다.
따라서 그 때와 똑같이 입력으로 회전시킬 방식이 주어지면,
T 크기의 배열 rotateArr에 모든 톱니바퀴가 어떻게 회전이 되는지 저장한 후
rotateArr에 따라 톱니바퀴를 회전시키는 방식으로 구현했다.
전체 풀이
let fs = require("fs");
let input = require("fs").readFileSync("/dev/stdin").toString().trim().split("\n");
// 톱니바퀴 수
let N = parseInt(input.shift());
// 톱니바퀴 배열.
let Wheels = new Array(N).fill(0);
Wheels = Wheels.map((Value, Index) => {
return input.shift().split('').map(Number);
});
// 회전 input
const Orders = input.splice(1, parseInt(input[0])).map(v => v.split(' ').map(Number));
// 톱니바퀴의 인접 톱니 인덱스.
const LEFT = 6;
const RIGHT = 2;
// 회전 + 이동 함수.
// BFS와 유사하게 회전 계산.
const Rotate = (WheelNum, Order) => {
// 회전 방향 저장 배열.
let rotateArr = new Array(N).fill(0);
rotateArr[WheelNum - 1] = Order;
// 첫번쨰 회전 저장.
let Queue = [[WheelNum, Order]];
let idx = 0;
// BFS의 while 문과 유사.
while (Queue.length > idx) {
const [Now, Turn] = Queue[idx];
const LeftWheel = Now - 1;
const RightWheel = Now + 1;
// 왼쪽 톱니바퀴 확인
if (LeftWheel > 0) {
// 인접한 톱니가 다른극이면.
if (rotateArr[LeftWheel - 1] === 0 && Wheels[Now - 1][LEFT] !== Wheels[LeftWheel - 1][RIGHT]) {
const NextRotate = Turn === 1 ? -1 : 1;
rotateArr[LeftWheel - 1] = NextRotate;
Queue.push([LeftWheel, NextRotate]);
}
}
// 오른쪽 톱니바퀴 확인.
if (RightWheel <= N) {
// 인접한 톱니가 다른극이면.
if (rotateArr[RightWheel - 1] === 0 && Wheels[Now - 1][RIGHT] !== Wheels[RightWheel - 1][LEFT]) {
const NextRotate = Turn === 1 ? -1 : 1;
rotateArr[RightWheel - 1] = NextRotate;
Queue.push([RightWheel, NextRotate]);
}
}
idx++;
}
// 톱니 바퀴 회전 진행.
for (let i = 0; i < rotateArr.length; i++) {
if (rotateArr[i] === 1) {
Wheels[i] = [Wheels[i].pop(), ...Wheels[i]];
}else if (rotateArr[i] === -1) {
Wheels[i].push(Wheels[i].shift());
}
}
};
const solution = () => {
// 입력에 따라 톱니바퀴 회전 진행.
for (const [WheelNum, Order] of Orders) {
Rotate(WheelNum, Order);
}
let answer = 0;
// 각각의 톱니를 확인하며 12시가 S극이면 answer 값 1증가.
Wheels.forEach(v => {
if (v[0] === 1) {
answer++;
}
});
// 정답 출력.
console.log(answer);
};
solution();
이전의 풀었던 문제를 복습할 수 있었던 문제였다.