어제의 나보다 성장한 오늘의 나

[백준][BOJ-14891][자바] 톱니바퀴 본문

알고리즘/백준(BOJ)

[백준][BOJ-14891][자바] 톱니바퀴

NineOne 2021. 4. 8. 17:48

www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터

www.acmicpc.net

import java.util.*;
import java.io.*;

public class Main {
	static int[][] gear = new int[4][8];
	static int gearAmount = 4; // 톱니바퀴 갯수
	static int gearNum = 8; // 톱니 갯수

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		for (int i = 0; i < 4; i++) {
			String a = br.readLine();
			for (int j = 0; j < 8; j++) {
				gear[i][j] = a.charAt(j) - '0';
			}
		}

		int T = Integer.parseInt(br.readLine());
		int pow = 1;
		int result =0;

		for (int i = 0; i < T; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			int start = Integer.parseInt(st.nextToken())-1;
			int dis = Integer.parseInt(st.nextToken());
			
			int left = start;
			int right = start;
			boolean leftCheck = false;
			boolean rightCheck = false;
			int[] rotate = new int[gearAmount];
			rotate[start] = dis;
			
			while(true) {
				left--;
				right++;
				
				dis *=-1;
				
				if(left<0 && right > gearAmount-1) break;
				
				if(left >= 0 && !leftCheck) {
					if(gear[left][2] != gear[left+1][6]) rotate[left] = dis;
					else leftCheck = true;
				}
				
				if(right<gearAmount && !rightCheck) {
					if(gear[right][6] != gear[right-1][2]) rotate[right] = dis;
					else rightCheck = true;
				}
			}
			
			for(int j=0; j<gearAmount; j++) {
				if(rotate[j] == 0) continue;
				rotateGear(j, rotate[j]);
			}
		}
		
		for(int j=0; j<gearAmount; j++) {
			result += gear[j][0] * pow;
			pow *=2;
		}
		
		System.out.println(result);
	}

	private static void rotateGear(int curr, int dis) {
		int temp = 0;
		
		if (dis == 1) {
			temp = gear[curr][gearNum-1];
			for (int i = gearNum-1; i > 0; i--) {
				gear[curr][i] = gear[curr][i-1];
			}
			gear[curr][0] = temp;
		}else {
			temp = gear[curr][0];
			for (int i = 0; i < gearNum-1; i++) {
				gear[curr][i] = gear[curr][i+1];
			}
			gear[curr][gearNum-1] = temp;
		}
	}
}

정리

  • 문제 그대로 코딩하면 문제가 없다. 하지만 이 문제는 차례대로 일어나는게 아닌! 돌아가는 톱니바퀴를 다 찾고 마지막에 일관적으로 돌려줘야 한다.
Comments