728x90
--- 문제 ---
--- 코드 ---
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);
}
}
}
--- 출처 ---
반응형