[JavaScript] 15662 톱니바퀴 (2) (JS)

SanE·2024년 4월 15일

Algorithm

목록 보기
96/127

톱니바퀴(2)

📚 문제 설명


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();

🧐 후기


이전의 풀었던 문제를 복습할 수 있었던 문제였다.

profile
JavaScript를 사용하는 모두를 위해...

0개의 댓글