본문 바로가기

Algorithms/Baekjoon

[Java] 백준 알고리즘 14891번 문제 : 삼성 SW 역량 테스트 기출 문제 - 톱니바퀴 (Simulation, 시뮬레이션)

--- 문제 ---

 

 

 

--- 코드 ---

 

LinkedList 를 활용해서 톱니 바퀴가 반시계 방향으로 이동하면 첫번째 값을 맨 뒤로 옮기고

시계 방향으로 이동하면 맨 뒤의 값을 첫번째로 옮기면서 회전 시켜 주었습니다.

 

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


public class Bj14891 {

	public static LinkedList<Integer>[] wheels;
	public static boolean[] between;
	
	
	public static void main(String[] args) throws IOException{
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		between = new boolean[3];
		wheels = new LinkedList[4];
		StringTokenizer st;
		for(int s=0; s<4; ++s) {
			st = new StringTokenizer(br.readLine());
			String[] line = st.nextToken().split("");
			LinkedList<Integer> tmp = new LinkedList();
			for(int i=0; i<8; ++i) {
				tmp.add(stoi(line[i]));
			}
			wheels[s] = tmp;
		}
		
		st = new StringTokenizer(br.readLine());
		int K = stoi(st.nextToken());
		for(int i=0; i<K; ++i) {
			st = new StringTokenizer(br.readLine());
			int start = stoi(st.nextToken())-1;
			int direc = stoi(st.nextToken());
			
			// 먼저 시작한 톱니바퀴 회전시키기
			checkBetween();
			rotate(wheels[start], direc);
			// 0 1 2 3
			switch(start) {
			case 0:
				if(!between[0]) {
					rotate(wheels[1],direc*-1);
					if(!between[1]) {
						rotate(wheels[2],direc);
						if(!between[2]) {
							rotate(wheels[3],direc*-1);
						}
					}
				}
				break;
			case 1:
				if(!between[0]) {
					rotate(wheels[0],direc*-1);
				}
				if(!between[1]) {
					rotate(wheels[2],direc*-1);
					if(!between[2]) {
						rotate(wheels[3],direc);
					}
				}
				break;
			
			case 2:
				if(!between[1]) {
					rotate(wheels[1],direc*-1);
					if(!between[0]) {
						rotate(wheels[0],direc);
					}
				}
				if(!between[2]) {
					rotate(wheels[3],direc*-1);
				}
				break;
			case 3:
				if(!between[2]) {
					rotate(wheels[2],direc*-1);
					if(!between[1]) {
						rotate(wheels[1],direc);
						if(!between[0]) {
							rotate(wheels[0],direc*-1);
						}
					}
				}
				break;
			}
		}
		
		int[] grade = {1,2,4,8};
		int sum = 0;
		for(int i=0; i<4; ++i) {
			if(wheels[i].get(0)==1) {
				sum+=grade[i];
			}
		}
		System.out.println(sum);
			
	}
	
	public static int stoi(String s) {
		return Integer.parseInt(s);
	}
	
	// 톱니바퀴의 사이를 체크해서 영향을 받아 회전하는지 안하는지 확인
	public static void checkBetween() {
		for(int i=0; i<3; ++i) {
			// 같으면 true
			if(wheels[i].get(2)==wheels[i+1].get(6)) {
				between[i] = true;
			}
			else {
				between[i] = false;
			}
		}
	}
	
	// 톱니바퀴를 회전 시키는 함수
	public static void rotate(LinkedList<Integer> wheel, int direc) {
		// clock wise
		if(direc==1) {
			// last to head
			int last = wheel.remove(7);
			wheel.add(0, last);
		}
		else {
			// head to last
			int head = wheel.remove(0);
			wheel.add(7,head);
		}
	}

}

 

 

--- 출처 ---

 

www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

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

www.acmicpc.net

 

 

반응형