728x90
300x250
deque 메소드는 https://eskeptor.tistory.com/98 블로그를 참고하였다.
톱니바퀴 하나를 Deque로 선언했고, 그 톱니바퀴들을 담을 Deque배열을 선언했다.
Deque안에는 String 요소들로 이루어져있도록 했다. (극 정보를 String으로 받음)
1. 맞닿은 극이 서로다른지 확인
2. 나 자신 회전
맞닿은 극이 서로다르다면 1,2를 반복해가면서 돌린다.. visit[]함수로 이미 검사한 톱니바퀴인지 체킹했다.
import java.io.*;
import java.util.*;
public class Main {
public static int K,ans = 0;
public static StringTokenizer st;
public static boolean[] visit = new boolean[5]; //이미 극이 같은지를 검사한 톱니바퀴인지 체크하기 위함
public static Deque<String>[] dq = new ArrayDeque[5]; // 톱니바퀴(Deque) 4개를 담을 배열 , deque를 담을 배열을 선언하고 각 idx에 디큐를 생성해줌..
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
for (int i = 1; i <= 4; i++) {
String s = bf.readLine();
dq[i] = new ArrayDeque<String>(); //각 idx에 디큐 생성
for (int j = 0; j < 8; j++) {
dq[i].add(String.valueOf(s.charAt(j))); //각 톱니바퀴에 8개의 극(N,S) 정보 넣기
}
}
K = Integer.parseInt(bf.readLine());
for (int i = 0; i < K; i++) {
String s = bf.readLine();
st = new StringTokenizer(s);
int gearNum = Integer.parseInt(st.nextToken());
int dir = Integer.parseInt(st.nextToken());
visit[gearNum]=true;
dfs(gearNum,dir);
visit[gearNum]=false;
}
//점수계산
for (int i = 0; i < 4; i++) {
//System.out.println(dq[i+1]);
if(dq[i+1].peekFirst().equals("1")) { //S극이면 2의 i승 점
ans += Math.pow(2,i);
}
}
System.out.println(ans);
}
public static void dfs(int gearNum, int dir) {
if(gearNum <= 0 || gearNum>4)
return;
String[] arr = new String[dq[gearNum].size()]; // 맞닿아 있는 극의 정보 보기위해 배열로 변환
dq[gearNum].toArray(arr);
// 내 기준 왼쪽 톱니바퀴 확인
if(gearNum-1 > 0 &&!visit[gearNum-1]) {
String[] leftArr = new String[dq[gearNum-1].size()];
dq[gearNum-1].toArray(leftArr);
if(!arr[6].equals(leftArr[2])) { //원형으로 뒀을때 내 톱니바퀴의 인덱스6과 왼쪽 톱니바퀴의 인덱스 2가 맞닿아있는 구조
visit[gearNum-1] = true;
dfs(gearNum-1,dir*(-1));
visit[gearNum-1] = false;
}
}
// 내 기준 오른쪽 톱니바퀴 확인
if(gearNum+1 <= 4 && !visit[gearNum+1]) {
String[] rightArr = new String[dq[gearNum+1].size()];
dq[gearNum+1].toArray(rightArr);
if(!arr[2].equals(rightArr[6])) { //원형으로 뒀을때 내 톱니바퀴의 인덱스2과 오른쪽 톱니바퀴의 인덱스 6가 맞닿아있는 구조
visit[gearNum+1] = true;
dfs(gearNum+1,dir*(-1));
visit[gearNum+1] = false;
}
}
// 방향대로 회전하기
if(dir==1) {
//시계방향
//12시가 가장 맨앞에 온다는 기준일때,맨끝에 있던 정보가 맨앞으로 오게됨
String str = dq[gearNum].removeLast();
dq[gearNum].addFirst(str);
} else if(dir==-1) {
//반시계방향
//12시가 가장 맨앞에 온다는 기준일때, 맨앞에 있던 정보가 맨 뒤로 가게됨
String str= dq[gearNum].removeFirst();
dq[gearNum].addLast(str);
}
}
}
728x90
'알고리즘 > DP' 카테고리의 다른 글
백준 12852번: 1로 만들기 2 [DP] - Java (0) | 2020.09.12 |
---|---|
백준 1463번: 1로 만들기 [DP] - Java (0) | 2020.09.12 |
백준 14890번 : 경사로 (0) | 2020.07.19 |
백준 5373번: 큐빙 (0) | 2020.03.24 |
백준 1932번 : 정수 삼각형 (0) | 2020.03.01 |