알고리즘 풀이/백준

[14891] 백준 - 톱니바퀴(JAVA)

데롱디롱 2021. 3. 14. 21:17
728x90

https://www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴

www.acmicpc.net

 

문제 풀이 방법

- n : 회전할 톱니바퀴 번호, d : 회전 방향
- n왼쪽으로 하나씩 이동하면서 [n-j-1]번 톱니바퀴의 2번과 [n-j]번 톱니바퀴의 6번이 서로 다른 경우,
   회전해야하므로 isTurn에 회전 방향을 기록해 나간다.
- [n-j-1]번 톱니바퀴의 2번과 [n-j]번 톱니바퀴의 6번이 같은 경우, 더이상 회전하지 않으므로 break
- 오른쪽도 왼쪽과 같은 방법으로 탐색하면서 isTurn을 완성한다.
- isTurn을 순회하며 -1은 반시계방향, 1은 시계방향으로 회전시켜준다.
- 위의 방법을 K번 반복한다.
- K번 반복이 끝나면, 각 톱니 바퀴의 0번째 자리가 S극(즉, 1)인지 확인하여 점수에 더해준다.

 

소스 코드

package com.boj.silver1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class 백준_14891_톱니바퀴 {
	static int wheels[][];

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		wheels = new int[4][8]; // 톱니바퀴 상태 입력
		for (int i = 0; i < 4; i++) {
			String s = br.readLine();
			for (int j = 0; j < 8; j++) {
				wheels[i][j] = s.charAt(j) - '0';
			}
		}

		int K = Integer.parseInt(br.readLine());
		for (int i = 0; i < K; i++) {
			st = new StringTokenizer(br.readLine());
			int n = Integer.parseInt(st.nextToken()) - 1; // 회전할 톱니 번호
			int d = Integer.parseInt(st.nextToken()); // 회전 방향
			int isTurn[] = new int[4]; // 회전 여부 저장
			isTurn[n] = d;

			// n 왼쪽
			for (int j = 0; n != 0 && j < n; j++) {
				if (wheels[n - j][6] != wheels[n - j - 1][2])
					isTurn[n - j - 1] = j % 2 == 0 ? -d : d; // j가 짝수면 다른 방향, 홀수면 같은 방향
				else
					break;
			}

			// n 오른쪽
			for (int j = 0; n != 3 && j < 4 - n - 1; j++) {
				if (wheels[n + j][2] != wheels[n + j + 1][6])
					isTurn[n + j + 1] = j % 2 == 0 ? -d : d; // j가 짝수면 다른 방향, 홀수면 같은 방향
				else
					break;
			}

			// 회전
			for (int j = 0; j < 4; j++) {
				if (isTurn[j] == 1) // 시계방향 회전
					goTurn(j);
				else if (isTurn[j] == -1) // 반시계방향 회전
					goBack(j);
			}
		}
		
		int result = 0;	// 점수
		for (int i = 0; i < 4; i++) {
			if(wheels[i][0] == 1)
				result += Math.pow(2, i);	// i번째 톱니바퀴 점수 : 2^i
		}
		System.out.println(result);
	}

	// 반시계방향
	private static void goBack(int n) {
		int temp = wheels[n][0];
		for (int i = 0; i <= 6; i++)
			wheels[n][i] = wheels[n][i + 1];
		wheels[n][7] = temp;
	}

	// 시계방향
	private static void goTurn(int n) {
		int temp = wheels[n][7];
		for (int i = 6; i >= 0; i--)
			wheels[n][i + 1] = wheels[n][i];
		wheels[n][0] = temp;
	}

}