문제
https://www.acmicpc.net/problem/14891
14891번: 톱니바퀴
총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴
www.acmicpc.net
풀이
그냥 구현하면 되는 문제다.
직접 돌아가는 곳에 대해 인접한 톱니바퀴가 돌아가는지 안돌아가는지 판단해주었다.
반시계, 시계방향으로 돌아가기 때문에 각 톱니바퀴는 ArrayList를 이용하여 구현해주었다.
코드
import java.util.*;
import java.io.*;
public class Main {
static ArrayList<Integer> arr [] = new ArrayList [5];
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
for(int i=0;i<4;i++) {
arr[i+1] = new ArrayList<>();
String str = br.readLine();
for(char ch : str.toCharArray()){
arr[i+1].add(ch-'0');
}
}
int k = Integer.parseInt(br.readLine());
for(int task=0;task<k;task++){
st = new StringTokenizer(br.readLine());
int num = Integer.parseInt(st.nextToken());
int dir = Integer.parseInt(st.nextToken());
int dirArr [] = new int [5];
dirArr[num] = dir;
if(num == 1){
for(int i=2;i<=4;i++){
if(arr[i-1].get(2) != arr[i].get(6))
dirArr[i] = dirArr[i-1]*-1;
}
}
else if(num == 4){
for(int i=3;i>=1;i--){
if(arr[i].get(2) != arr[i+1].get(6))
dirArr[i] = dirArr[i+1]*-1;
}
}
else{
if(arr[num].get(2) != arr[num+1].get(6))
dirArr[num+1] = dirArr[num] * -1;
if(arr[num-1].get(2) != arr[num].get(6))
dirArr[num-1] = dirArr[num] * -1;
if(num == 2){
if(arr[4].get(6) != arr[3].get(2))
dirArr[4] = dirArr[3] * -1;
}
else if(num == 3){
if(arr[2].get(6) != arr[1].get(2))
dirArr[1] = dirArr[2] * -1;
}
}
for(int i=1;i<=4;i++){
if(dirArr[i] == 1 || dirArr[i] == -1){
rotate(i, dirArr[i]);
}
}
}
int result = 0;
result += arr[1].get(0) == 0? 0 : 1;
result += arr[2].get(0) == 0? 0 : 2;
result += arr[3].get(0) == 0? 0 : 4;
result += arr[4].get(0) == 0? 0 : 8;
System.out.println(result);
}
static void rotate(int num, int dir){
if (dir == -1){
int n = arr[num].get(0);
arr[num].remove(0);
arr[num].add(n);
}
else{
int n = arr[num].get(7);
arr[num].remove(7);
arr[num].add(0, n);
}
}
}