Step-by-Step
[Java] 백준14891 - 톱니바퀴 본문
https://www.acmicpc.net/problem/14891
14891번: 톱니바퀴
첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터
www.acmicpc.net
와 .. 노트에 열심히 풀어가면서 썼던 문제ㅋㅋㅋ
가장 중요한 건 톱니바퀴 4개는 동시에 돌아간다는 것이다!!!
나는 2번째 톱니바퀴가 돌면.. 양 옆으로 한개씩 보고 돌릴지 안돌릴지 판단하고 구현했는데,
테케가 다 틀려서 몹시 당황했다.. 동시에 돌아가는것만 잘 알면 금방 풀릴듯!
각 톱니 데이터는 2차원 배열로 만들어서 저장해뒀고,
12시 방향이나 3시,9시 방향은 idx로 저장해서 반시계는 idx+1 시계는 idx-1 이런식으로 구현했다.
※ 반시계로 돌리면 다음 인덱스값이 나오니까 헷갈리지 말기!
※ 시계, 반시계 값은 1 , -1 이고 실제 인덱스 값은 idx -1 , idx + 1로 반대여서 헷갈렸다.
package BOJ_SS;
import java.util.*;
public class boj14891 {
public static int[][] wheel;
public static int[][] idx;
public static int[] dirs;
public static boolean[] isRot;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
wheel = new int[4][8];
idx = new int[4][2];
for(int i=0; i<4; i++) {
String str = sc.nextLine();
for(int j=0; j<8; j++)
wheel[i][j] = str.charAt(j) - '0';
// 오른쪽 인덱스 2 , 왼쪽 인덱스 6
idx[i][0] = 2;
idx[i][1] = 6;
}
int k = sc.nextInt();
for(int i=0; i<k; i++) {
int n = sc.nextInt()-1;
int dir = sc.nextInt();
checkRot(n, dir);
for(int j=0; j<4; j++) {
if(isRot[j])
rot(j);
}
}
System.out.println(totScore());
}
public static void checkRot(int n, int dir) {
isRot = new boolean[4];
dirs = new int[4];
// n이 짝수
// dir 값 : 1 시계방향 -1 반시계방향
if(n%2==0) {
dirs[0]=dir;
dirs[2]=dir;
dirs[1]=-dir;
dirs[3]=-dir;
}else {
dirs[0]=-dir;
dirs[2]=-dir;
dirs[1]=dir;
dirs[3]=dir;
}
// 오른쪽 idx[n][0]
// 왼쪽 idx[n][1]
isRot[n]=true;
boolean notRot = false;
for(int i=n-1; i>=0; i--) {
if(notRot) {
isRot[i] = false;
continue;
}
if(wheel[i][idx[i][0]]==wheel[i+1][idx[i+1][1]]) {
isRot[i] = false;
notRot = true;
} else {
isRot[i] = true;
}
}
notRot = false;
for(int i=n+1; i<4; i++) {
if(notRot) {
isRot[i] = false;
continue;
}
if(wheel[i][idx[i][1]]==wheel[i-1][idx[i-1][0]]) {
isRot[i] = false;
notRot = true;
} else {
isRot[i] = true;
}
}
}
public static void rot(int n) {
/* dir 값 */
// 시계방향 회전 : 1
// 반시계방향 회전 : -1
/* idx 값 */
// 시계방향 회전 : -1
// 반시계방향 회전 : +1
int dir = dirs[n];
if(dir == -1) {
idx[n][0] = (idx[n][0]+1) % 8;
idx[n][1] = (idx[n][1]+1) % 8;
} else {
idx[n][0] = (idx[n][0]+7) % 8;
idx[n][1] = (idx[n][1]+7) % 8;
}
}
public static int totScore() {
int res = 0;
for(int i=0; i<4; i++) {
int left = idx[i][1];
int top = (left+2)%8;
res += wheel[i][top] * Math.pow(2, i);
}
return res;
}
}
'언어 > JAVA' 카테고리의 다른 글
[Java] 백준9376 - 탈옥 (1) | 2022.11.12 |
---|---|
[Java] 백준15683 - 감시 (0) | 2022.10.20 |
[Java] 백준14890 - 경사로 (0) | 2022.10.20 |
[Java] 백준14889 - 스타트와 링크 (0) | 2022.10.19 |
[Java] 백준14888 - 연산자 끼워넣기 (0) | 2022.10.19 |
Comments