백준

[백준] 14891번 톱니바퀴 (java, 시뮬레이션)

해랑쓰 2021. 4. 21. 01:17
728x90
반응형

www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

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

www.acmicpc.net

시계방향 반시계방향 이동은 앞, 뒤의 원소를 반대쪽에 다시 넣어주는 것으로 구현하면 된다. (덱을 써도된다.)

 

현재 톱니바퀴  6번 인덱스 (left) 와 왼쪽 톱니바퀴 2번 인덱스를 비교해서 다르면 이동시킨다. 

- 방향 반대, left는 왼쪽 톱니바퀴의 6번 인덱스로 바꿔줌. (1번 톱니바퀴까지 쭉 진행)

 

현재 톱니바퀴 2번 인덱스 (right)와 오른쪽 톱니바퀴의 6번 인덱스를 비교해서 다르면 오른쪽 톱니바퀴들 순차적으로 방향 전환.

- 방향 반대로 만들어주고 right변수는 오른쪽 톱니바퀴의 2번 인덱스로 바꿔준다. (그 다음 톱니바퀴와 계속 비교하기 위해서)

 

왼쪽으로 진행할 때와 오른쪽으로 진행할 때 시작은 현재 톱니바퀴의 2번 인덱스와 6번 인덱스를 가지고 시작해야하므로 초기 left, right변수는 다른 변수에 저장하고 덮어씌워지지 않도록 주의한다

 

 

package algo0420;

import java.util.ArrayList;
import java.util.Scanner;

public class B_14891_톱니바퀴_Main {
	static ArrayList<Integer>[] wheel;
	static int k;
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		wheel=new ArrayList[5];
		for (int i = 0; i < 5; i++) {
			wheel[i]=new ArrayList<>();
		}
		for (int i = 1; i <= 4; i++) {
			String s=sc.next();
			for (int j = 0; j <8; j++) {
				wheel[i].add(s.charAt(j)-'0');
			}
		}
		
		k=sc.nextInt();
		
		for (int i = 0; i < k; i++) {
			int num=sc.nextInt();
			int dir=sc.nextInt();//1 시계 , -1반시계
			
			int c_left=wheel[num].get(6);//현재 톱니바퀴 값 저장해둠
			int c_right=wheel[num].get(2);
			int c_dir=dir;
			int left=c_left;
			int right=c_right;
			for (int p = num-1; p>=1; p--) {
				if(left!=wheel[p].get(2)) {
					left=wheel[p].get(6);
					dir*=-1;
					rotate(p,dir);
				}else {
					break;//회전하지 않는다.
				}
			}
			left=c_left;
			right=c_right;
			dir=c_dir;
			for (int p = num+1; p <=4; p++) {
				if(right!=wheel[p].get(6)) {
					right=wheel[p].get(2);
					dir*=-1;
					rotate(p,dir);
				}else {
					break;//회전하지 않는다.
				}
			}
			
			rotate(num,c_dir);//현재 톱니바퀴 회전 (방향값때문에 나중에 돌린다)
//			print();
		}
		int total=0;
		for (int i = 1; i <=4; i++) {
			total+=wheel[i].get(0)*Math.pow(2, i-1);
		}
		System.out.println(total);
	}
	
	
	private static void rotate(int num,int dir) {
		if(dir==1) {//시계
			clock(num,dir);
		}else {
			rclosk(num,dir);
		}
	}
	
	private static void rclosk(int num,int dir) {
			int temp=wheel[num].get(0);
			wheel[num].remove(0);
			wheel[num].add(7,temp);
		
		
	}
	private static void clock(int num,int dir) {
//		시계 방향 회전
		//현재 바퀴 왼쪽 바퀴들 회전
			int temp=wheel[num].get(7);
			wheel[num].remove(7);
			wheel[num].add(0,temp);
		
		
	}
	
	private static void print() {
		for (int i = 1; i <= 4; i++) {
			for (int j = 0; j <8; j++) {
				System.out.print(wheel[i].get(j)+" ");
			}
			System.out.println();
		}
		System.out.println();
	}
}
728x90
반응형