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

    2021. 3. 14.

    by. 데롱디롱

    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;
    	}
    
    }
    

    댓글