[백준] 14891번 톱니바퀴 (java, 시뮬레이션)
728x90
반응형
시계방향 반시계방향 이동은 앞, 뒤의 원소를 반대쪽에 다시 넣어주는 것으로 구현하면 된다. (덱을 써도된다.)
현재 톱니바퀴 6번 인덱스 (left) 와 왼쪽 톱니바퀴 2번 인덱스를 비교해서 다르면 이동시킨다.
- 방향 반대, left는 왼쪽 톱니바퀴의 6번 인덱스로 바꿔줌. (1번 톱니바퀴까지 쭉 진행)
현재 톱니바퀴 2번 인덱스 (right)와 오른쪽 톱니바퀴의 6번 인덱스를 비교해서 다르면 오른쪽 톱니바퀴들 순차적으로 방향 전환.
- 방향 반대로 만들어주고 right변수는 오른쪽 톱니바퀴의 2번 인덱스로 바꿔준다. (그 다음 톱니바퀴와 계속 비교하기 위해서)
왼쪽으로 진행할 때와 오른쪽으로 진행할 때 시작은 현재 톱니바퀴의 2번 인덱스와 6번 인덱스를 가지고 시작해야하므로 초기 left, right변수는 다른 변수에 저장하고 덮어씌워지지 않도록 주의한다
package algo0420;
import java.util.ArrayList;
import java.util.Scanner;
public class B_14891_톱니바퀴_Main {
static ArrayList<Integer>[] wheel;
static int k;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
wheel=new ArrayList[5];
for (int i = 0; i < 5; i++) {
wheel[i]=new ArrayList<>();
}
for (int i = 1; i <= 4; i++) {
String s=sc.next();
for (int j = 0; j <8; j++) {
wheel[i].add(s.charAt(j)-'0');
}
}
k=sc.nextInt();
for (int i = 0; i < k; i++) {
int num=sc.nextInt();
int dir=sc.nextInt();//1 시계 , -1반시계
int c_left=wheel[num].get(6);//현재 톱니바퀴 값 저장해둠
int c_right=wheel[num].get(2);
int c_dir=dir;
int left=c_left;
int right=c_right;
for (int p = num-1; p>=1; p--) {
if(left!=wheel[p].get(2)) {
left=wheel[p].get(6);
dir*=-1;
rotate(p,dir);
}else {
break;//회전하지 않는다.
}
}
left=c_left;
right=c_right;
dir=c_dir;
for (int p = num+1; p <=4; p++) {
if(right!=wheel[p].get(6)) {
right=wheel[p].get(2);
dir*=-1;
rotate(p,dir);
}else {
break;//회전하지 않는다.
}
}
rotate(num,c_dir);//현재 톱니바퀴 회전 (방향값때문에 나중에 돌린다)
// print();
}
int total=0;
for (int i = 1; i <=4; i++) {
total+=wheel[i].get(0)*Math.pow(2, i-1);
}
System.out.println(total);
}
private static void rotate(int num,int dir) {
if(dir==1) {//시계
clock(num,dir);
}else {
rclosk(num,dir);
}
}
private static void rclosk(int num,int dir) {
int temp=wheel[num].get(0);
wheel[num].remove(0);
wheel[num].add(7,temp);
}
private static void clock(int num,int dir) {
// 시계 방향 회전
//현재 바퀴 왼쪽 바퀴들 회전
int temp=wheel[num].get(7);
wheel[num].remove(7);
wheel[num].add(0,temp);
}
private static void print() {
for (int i = 1; i <= 4; i++) {
for (int j = 0; j <8; j++) {
System.out.print(wheel[i].get(j)+" ");
}
System.out.println();
}
System.out.println();
}
}
728x90
반응형
'백준' 카테고리의 다른 글
[백준] 4307번 개미 (java, 구현) (0) | 2021.04.21 |
---|---|
[백준] 17609번 회문 (java, 구현) (0) | 2021.04.21 |
[백준] 17822번 원판 돌리기 (java, 시뮬레이션) (0) | 2021.04.21 |
[백준] 1713번 후보 추천하기 (java, 시뮬레이션, 구현) (0) | 2021.04.20 |
[백준] 17837번 새로운 게임2 (java, 시뮬레이션, 구현) (0) | 2021.04.20 |
TAGS.