백준 문제풀이

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

쿠쿠s 2021. 12. 22. 15:09

[문제]

출처 - https://www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

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

www.acmicpc.net

 

N극(0) S극(1) 중을 하나를 나타내는 4개의 톱니바퀴를 회전시켜야 한다.

서로 맞닿은 극에 따라서 옆에 있는 톱니바퀴를 회전시킬 수도 있고, 회전시키지 않을 수도 있다. 

서로의 극이 같은 경우에는 회전시키지 않고, 다른 경우에만 회전을 시킨다.

극을 비교할 때에는 2번 6번 방향을 기준으로 한다.


[문제 풀이]

  • 시뮬레이션은 문제의 조건을 잘 읽고 그대로 이행을 해줘야 한다.

주어진 톱니바퀴는 4개로 고정되어있고 각 톱니바퀴수는 8개 이므로 2차원 배열을 통해 표현할 수 있다.

회전시킬 톱니바퀴번호 회전하는 방향을 변수에 담고 회전할 톱니의 의 좌측 우측을 비교하여 회전시키면 된다.

 


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

public class Main {
	static int gear[][];
	static int d[]; //기어의 회전 정보를 담고있음
	static int n,m;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));		
		StringTokenizer st;
		
		gear = new int[4][8];
		
		for(int i=0; i<4 ;i++) {
			String s = br.readLine();
			for(int j=0; j<8; j++) {
				gear[i][j] = s.charAt(j) - '0';
			}
		}
		
		int k = Integer.parseInt(br.readLine());
		
		while(k-->0) {
			st = new StringTokenizer(br.readLine());
			//배열에 담긴 gear는 1부터 시작이아닌 0부터라 -1을 해줌
			int gearN = Integer.parseInt(st.nextToken()) - 1;
			int turn = Integer.parseInt(st.nextToken());
			
			//톱니의 회전방향 정보를 담음
			d = new int[4]; 
			
			d[gearN] = turn; 
			checkDir(gearN);
			gearTurn();	
		}
		
		int ans =0;
		if(gear[0][0] == 1) ans+=1;
		if(gear[1][0] == 1) ans+=2;
		if(gear[2][0] == 1) ans+=4;
		if(gear[3][0] == 1) ans+=8;
		System.out.println(ans);
	}

	static void checkDir(int gearN){
		//좌측 톱니 회전 방향 검사
		for(int i=gearN-1; i>=0; i--) {
			if(gear[i][2] != gear[i+1][6]) {
				d[i] = -d[i+1];
			}else {
				//회전을 하지않으면 다음 톱니도 회전을 하지 않게 된다.  
				break;
			}
		}
		//우측 톱니 회전 방향 검사
		for(int i=gearN+1; i<4; i++) {
			if(gear[i][6] != gear[i-1][2]) {
				d[i] = -d[i-1];
			}else {
				//회전을 하지않으면 다음 톱니도 회전을 하지 않게 된다.  
				break;
			}
		}	
	}
	
	static void gearTurn() {
		int temp = 0;
		
		for(int i=0; i<4; i++) { //모든 톱니에 대해서
			//시계방향 회전
			if(d[i] == 1) {
				temp = gear[i][7];
				for(int j=7; j>0; j--) {
					gear[i][j] = gear[i][j-1];
				}
				gear[i][0] = temp;
			}
			//반시계방향회전
			if(d[i] == -1) {
				temp = gear[i][0];
				for(int j=0; j<7; j++) {
					gear[i][j] = gear[i][j+1];
				}
				gear[i][7] = temp;
			}
		}
	}
}