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

 

14891번: 톱니바퀴

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

www.acmicpc.net

문제

구현(Simulation) 문제이다.

 

해결 방안

문제 구성을 크게 1. 입력 받는 부분, 2. 각 톱니바퀴 회전 방향 입력에 따른 전체 톱니바퀴 회전 방향 구하기, 3. 회전 방향에 따른 각 톱니바퀴 상태 재설정, 4. 다 회전한 후 톱니바퀴 점수 합 구하기 로 4가지로 구성하였다.

1. 입력 받는 부분은 그냥 입력 받으면 되는 부분이라 넘어갑니다.

2. 각 톱니 바퀴 회전 방향 입력에 따른 전체 톱니바퀴 회전 방향 구하는 것은 톱니바퀴가 4개로 설정되어 있어 전체를 직접 구현하였다.
(톱니바퀴 1이 회전할때, 톱니바퀴 2가 회전할때, 톱니바퀴 3이 회전할때, 톱니바퀴 4가 회전할 때)
각각 톱니바퀴 회전 방향이 주어졌을 때 위의 4가지 경우를 모두 구해주었다.
그리고 static 으로 int형 gearDir[]에 각 톱니바퀴들이 회전해야 하는 방향을 넣어주었다. (1:시계, 0:정지, -1:반시계) 

3. 회전 방향에 따른 각 톱니바퀴 상태 재설정하는 부분은 위에서 저장한 gearDir[]를 참고하여 각각의 톱니바퀴들의 상태를 재설정해주었다.
gearDir[gearIdx]가 0이면 해당 톱니바퀴는 정지되야 하므로 넘어가주고 1과 -1일때 각각의 상태를 gear[][]에 재설정해주었다.

4. gear[][]를 가지고 문제의 출력에 맞게 점수를 구해준다.

 

코드

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

// 톱니바퀴
// 총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 일렬로 놓여져 있다.
// 톱니는 N극 또는 S극 중 하나
// 톱니바퀴가 다른 톱니바퀴와 서로 맞닿는 톱니의 극이 다르면 서로 반대방향으로 회전하게 됨

public class Main {
	
	// 톱니바퀴 4개의 톱니 상태(12시 방향부터 시작)(N극은 0, S극은 1)
	static int[][] gear = new int[5][9]; //[1~4][1~8] 
	static int K; // 회전 횟수(1~100)
	static int gearIdx; // 회전할 톱니(1~4)
	static int dir; // 입력 받은 값
	static int[] gearDir = new int[5]; // 각 톱니바퀴들의 회전 방향 (시계방향: 1, 반시계방향:-1 +  정지:0)
	static int result; // 네 톱니바튀의 점수의 합

	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String str;
		for(int i=1; i<=4; i++) {
			str = br.readLine();
			for(int j=1; j<=8; j++) {
				gear[i][j] = Integer.parseInt(str.split("")[j-1]);
			}
		}
		
		K = Integer.parseInt(br.readLine());
		StringTokenizer st;
		for(int i=0; i<K; i++) {
			str = br.readLine();
			st = new StringTokenizer(str, " ");
			
			gearIdx = Integer.parseInt(st.nextToken());
			dir = Integer.parseInt(st.nextToken());
			
			caculateGearDir();
			rotateGear();
		}
		
		result = 0;
		caculateScore();
		System.out.println(result);
		
	}
	
	// 입력 받은 gearIdx, dir를 이용한 다른 기어 회전 방향 구하기
	static void caculateGearDir(){
		// 초기화
		for(int i=1; i<=4; i++) {
			gearDir[i] = 0;
		}
		
		// 해당 gear방향 입력받은 dir 값으로 설정
		gearDir[gearIdx] = dir;

		// 다른 톱니바퀴와 만나는 부분 3, 7
		switch(gearIdx) {
		
			// 톱니바퀴 1이 회전할 경우 1->2->3->4
			case 1:
				// 톱니바퀴 1이 회전하고 맞물린 부분이 값이 다를때 톱니바퀴2 반대방향으로 회전
				if(gearDir[1] != 0 && gear[1][3] != gear[2][7] )
					gearDir[2] = gearDir[1] * -1;

				// 톱니 2와 톱니 3
				if(gearDir[2] != 0 && gear[2][3] != gear[3][7] )
					gearDir[3] = gearDir[2] * -1;
				
				// 톱니 3과 톱니 4
				if(gearDir[3] != 0 && gear[3][3] != gear[4][7] )
					gearDir[4] = gearDir[3] * -1;
					
				break;
			
			// 톱니 바퀴 2가 회전하는 경우 2->3->4 2->1
			case 2:
				// 톱니 2와 1
				if(gearDir[2] != 0 && gear[2][7] != gear[1][3])
					gearDir[1] = gearDir[2] * -1;
				
				// 톱니 2와 3
				if(gearDir[2] != 0 && gear[2][3] != gear[3][7])
					gearDir[3] = gearDir[2] * -1;
				
				// 톱니 3과 4
				if(gearDir[3] != 0 && gear[3][3] != gear[4][7])
					gearDir[4] = gearDir[3] * -1;
				
				break;
			
			// 톱니 바퀴 3이 회전하는 경우 3->4 3->2->1
			case 3:
				// 톱니 3과 4
				if(gearDir[3] != 0 && gear[3][3] != gear[4][7])
					gearDir[4] = gearDir[3] * -1;
				
				// 톱니 3과 2
				if(gearDir[3] != 0 && gear[3][7] != gear[2][3])
					gearDir[2] = gearDir[3] * -1;
				
				// 톱니 2와 1
				if(gearDir[2] != 0 && gear[2][7] != gear[1][3])
					gearDir[1] = gearDir[2] * -1;
				
				break;
			
			// 톱니 바퀴 4가 회전하는 경우 4->3->2->1
			case 4:
				// 톱니 4와 3
				if(gearDir[4] != 0 && gear[4][7] != gear[3][3])
					gearDir[3] = gearDir[4] * -1;
				
				// 톱니 3과 2
				if(gearDir[3] != 0 && gear[3][7] != gear[2][3])
					gearDir[2] = gearDir[3] * -1;
				
				// 톱니 2와 1
				if(gearDir[2] != 0 && gear[2][7] != gear[1][3])
					gearDir[1] = gearDir[2] * -1;
				
				break;
		}
			
	}
	
	// 각 톱니바퀴 각 gearDir에 맞게 회전
	static void rotateGear() {
		int[] tempGear;
		
		// 모든 톱니바퀴 gearDir에 맞게 회전시켜줌
		for(int i=1; i<=4; i++) {
			
			tempGear = new int[9];
			
			// 해당 톱니바퀴가 회전 안할 때(0)는 넘어감
			if(gearDir[i] == 0)
				continue;
			
			// 해당 톱니바퀴가 시계방향(1)
			if(gearDir[i] == 1) {
				tempGear[1] = gear[i][8];
				for(int j=2; j<=8; j++) {
					tempGear[j] = gear[i][j-1];
				}
			}
			// 해당 톱니바퀴가 반시계방향(-1)
			else if(gearDir[i] == -1) {
				for(int j=1; j<=7; j++) {
					tempGear[j] = gear[i][j+1];
				}
				tempGear[8] = gear[i][1];
			}
			
			// 회전한 배열을 gear에 다시 저장해줌
			gear[i] = tempGear.clone();
		}
	}
	
	// K번 회전시킨 이후에 네 톱니바퀴 점수의 합 출력
	//1번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 1점
	//2번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 2점
	//3번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 4점
	//4번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 8점
	static void caculateScore() {
		
		if(gear[1][1] == 1)
			result += 1;
		if(gear[2][1] == 1)
			result += 2;
		if(gear[3][1] == 1)
			result += 4;
		if(gear[4][1] == 1)
			result += 8;
	}
}

+ Recent posts