시뮬레이션, 구현. 큐.
문제에 적힌 그대로를 구현. 하나 주의할 것이 있다면 톱니바퀴를 굴리고 옆의 톱니바퀴를 체크하는 것이 아닌,
옆의 톱니바퀴들을 모두 체크하고 톱니바퀴를 굴려야한다.
톱니바퀴를 굴리고 나서 옆의 톱니바퀴를 체크하면 이미 굴린 후라 N과 S가 바뀌게 되고, 굴리지 말아야 할 것을 굴리거나 굴려야 하는 것을 못 굴리게 된다.
import java.util.*;
import java.io.*;
public class Main{
static int arr[][];
public static void main(String[] args) throws IOException{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
arr=new int[5][8];
for(int i=1;i<arr.length;i++) {
String line=br.readLine();
for(int j=0;j<arr[0].length;j++) {
arr[i][j]=line.charAt(j)-'0';
}
}
int K=Integer.parseInt(br.readLine());
for(int i=0;i<K;i++) {
st=new StringTokenizer(br.readLine());
int n1=Integer.parseInt(st.nextToken());
int n2=Integer.parseInt(st.nextToken());
gear(n1,n2);
}
int num[]= {0,1,2,4,8};
int sum=0;
for(int i=1;i<arr.length;i++) {
if(arr[i][0]==1)
sum+=num[i];
}
System.out.println(sum);
}
public static void gear(int n1,int n2) {
//n2가 1이면 시계방향, -1이면 반시계방향
int copy[][]=new int[5][8];
for(int i=1;i<copy.length;i++)
copy[i]=arr[i].clone();
int left=6;
int right=2;
Queue<Gear> queue=new LinkedList<>();
queue.add(new Gear(n1,true,n2));
Gear moving[]=new Gear[arr.length];
for(int i=1;i<moving.length;i++)
moving[i]=new Gear(i,false,0);
moving[n1].move=true;
while(!queue.isEmpty()) {
Gear temp= queue.poll();
int number=temp.number;
boolean move=temp.move;
int dir=temp.dir;
moving[number] = new Gear(number,move,dir);
int changedDir = dir==1?-1:1;
if(number-1>=1) {
if(arr[number][left]!=arr[number-1][right]&&!moving[number-1].move)
queue.add(new Gear(number-1,true,changedDir));
}
if(number+1<=4) {
if(arr[number][right]!=arr[number+1][left]&&!moving[number+1].move)
queue.add(new Gear(number+1,true,changedDir));
}
}
for(int i=1;i<moving.length;i++) {
if(moving[i].move) {
if(moving[i].dir== -1) { //반시계방향
int idx=1;
for(int j=0;j<arr[0].length;j++) {
arr[i][j]= copy[i][idx++];
if(idx==8) idx=0;
}
}
else { //시계방향
int idx = 7;
for(int j=0;j<arr[0].length;j++) {
arr[i][j] = copy[i][idx++];
if(idx==8) idx=0;
}
}
}
}
}
}
class Gear {
int number;
boolean move;
int dir;
Gear(int number,boolean move,int dir){
this.number=number;
this.move=move;
this.dir=dir;
}
}
문제 난이도에 비해 시간도 오래걸리고 코드도 이상하게 짠 것 같다.. 시간이 오래걸린 이유는 바보같이 0~3번째 톱니바퀴를 지정해 줬는데 여기서는 1~4번째 톱니바퀴였다. 그거를 못 찾아가지고 결괏값이 계속 이상하게 나왔다.
문제가 0번째 인덱스부터 시작인지 1번째 인덱스부터 시작인지 확인하고 배열을 만들자 !!!!
하루에 백준 1문제 이상 푸는 것을 목표로 하고있다.
https://solved.ac/profile/anwlro0212