[Java] 백준 14891번 톱니바퀴

2022. 4. 21. 23:40
728x90

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

 

14891번: 톱니바퀴

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

www.acmicpc.net

이번 문제는 시뮬레이션 문제인데 톱니바퀴의 2번 톱니와 6번 톱니를 주의해서 설정해 주면 쉽게 풀릴 것이라고 생각이 듭니다.

 

저는 이번 문제를 풀면서 LinkedList를 사용하였고 회전이 가능한 경우 시계와 반시계 방향에 주의하여 회전하였습니다.

처음부터 문제를 해석해 보면

 

4개의 톱니바퀴를 입력받습니다.

그 후, k를 입력받아 k만큼 톱니바퀴의 인덱스와 회전 방향을 입력받습니다.

10101111
01111101
11001110
00000010
2
3 -1
1 1

3번째 톱니바퀴의 회전 방향은 반시계입니다.

회전을 하기전 확인 형식으로 2번째와 4번째의 톱니바퀴를 확인합니다.

2번째의 톱니 2번과 3번째의 톱니 6번은 같습니다. 회전하지 않습니다.

4번째의 톱니 6번과 3번째의 톱니 2번은 다릅니다. 회전합니다.

그렇다면, 4번째의 톱니바퀴에서는 회전한다고 해서 변하는게 없습니다.

이런 형식으로 회전을 하기전 모든 톱니바퀴의 2번과 6번 톱니를 확인하여 회전해야하는지 체크를 해줍니다.

회전 가능한지 체크가 끝났다면, 이 정보를 토대로 시계방향과 반시계방향 체크를 해주어서 방향 list를 다시 설정해줍니다.

 

코드를 확인해보겠습니다.

 

package BJ;

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

public class BJ_톱니바퀴 {
	static LinkedList<Integer>[] gear;
	static int k;
	static int index, dir;
	static int[] isValid;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		gear = new LinkedList[4];
		
		for (int i = 0; i < 4; i++) {
			gear[i] = new LinkedList<>();
		}
		
		for (int i = 0; i < 4; i++) {
			String str = br.readLine();
			for (int j = 0; j < 8; j++) {
				gear[i].add(str.charAt(j) - '0');
			}
		}
		
		k = Integer.parseInt(br.readLine());
		
		for (int i = 0; i < k; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			index = Integer.parseInt(st.nextToken()) - 1;
			dir = Integer.parseInt(st.nextToken());
			isValid = new int[4]; // 회전하는 방향 저장
			check(index, dir); // 회전해야하는 톱니바퀴 체크
			rotate(isValid); // 톱니바퀴 회전
		}
		int result = calc();
		System.out.println(result);

	}
	private static int calc() {
		int result = 0;
		for (int i = 0; i < 4; i++) {
			if (gear[i].get(0) == 1) { // 12시 방향 톱니가 n일 경우
				result += Math.pow(2, i); // 1번 톱니 바퀴일 경우 2^0, 2번 2^1, 3번 2^2, 4번 2^3
			}
		}
		return result;
	}
	private static void rotate(int[] isValid) {
		for (int i = 0; i < 4; i++) {
			if(isValid[i] == 1) { // 회전 방향이 시계방향일 경우
				int temp = gear[i].pollLast(); // list의 마지막 원소 가져오면서 삭제
				gear[i].addFirst(temp); // list의 첫번째 원소로 추가
			}else if(isValid[i] == -1) { // 회전 방향이 반시계방향일 경우
				int temp = gear[i].pollFirst(); // list의 첫번째 원소 가져오면서 삭제
				gear[i].addLast(temp); // list의 마지막 원소로 추가
			}
		}
		
	}
	private static void check(int index, int dir) {
		isValid[index] = dir; 
		
		int prev = index - 1; // 왼쪽 톱니바퀴
		int post = index + 1; // 오른쪽 톱니바퀴
		
		if(prev >= 0 && isValid[prev] == 0) { // 왼쪽 톱니바퀴
			if(gear[prev].get(2) != gear[index].get(6)) { // 왼쪽 2번 톱니와 현재 6번 톱니가 다를 경우 
				check(prev, dir * -1); // 왼쪽 톱니바퀴로 가서 체크
			}
		}
		
		if(post <= 3 && isValid[post] == 0) { // 오른쪽 톱니바퀴
			if(gear[post].get(6) != gear[index].get(2)) { // 오른쪽 6번 톱니와 현재 2번 톱니가 다를 경우
				check(post, dir * -1); // 오른쪽 톱니바퀴로 가서 체크
			}
		}
	}

}

 

Ysik Github : https://github.com/Y1sik/Algorithm/blob/main/BJ/BJ_%ED%86%B1%EB%8B%88%EB%B0%94%ED%80%B4.java

반응형

BELATED ARTICLES

more