알고리즘
[백준 14891 JAVA] 톱니바퀴
begong
2024. 3. 19. 12:56
반응형
구현문제
문제에 로직이 다 나와있어서 구현을 어떻게 하느냐가 중요한 문제이다.
톱니바퀴끼리 바라보는것을 검사하고, 조건이 만족하면 돌리면된다.
나는 큐를 두개로 나누어 돌릴바퀴의정보를 담는 큐, 탐색을 위한 큐를 만들었다.
이렇게 한 이유는 톱늬를 미리 돌려버리면 조건을 검사하기 상당히 까다롭기때문에 검사를 마친 뒤 톱니바퀴를 한번에 돌리기 위해서이다.
톱니를 돌리는 것은 간단하게 배열을 이용했다. 길이가 8이라서 굳이 다른 자료구조를 이용할 필요가 없을것이라 생각했다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;
class Main {
static int[][] wheel = new int[4][8];
//2<->6 <바퀴> 2<->6
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line;
for (int i = 0; i < 4; i++) {
line = br.readLine();
for (int j = 0; j < 8; j++) {
wheel[i][j] = Integer.parseInt(String.valueOf(line.charAt(j)));
}
}
int K = Integer.parseInt(br.readLine());
StringTokenizer st;
for (int i = 0; i < K; i++) {
st = new StringTokenizer(br.readLine());
turnLogic(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
}
int answer = 0;
if (wheel[0][0] == 1) answer += 1;
if (wheel[1][0] == 1) answer += 2;
if (wheel[2][0] == 1) answer += 4;
if (wheel[3][0] == 1) answer += 8;
System.out.println(answer);
}
public static void turnLogic(int wheelNum, int dir) {
int[] dx = {-1, 1};
Queue<Turn> searchQ = new ArrayDeque<>();
Queue<Turn> q = new ArrayDeque<>();
searchQ.add(new Turn(wheelNum - 1, dir));
q.add(new Turn(wheelNum - 1, dir));
boolean[] visit = new boolean[4];
visit[wheelNum - 1] = true;
while (!searchQ.isEmpty()) {
Turn cur = searchQ.poll();
for (int i = 0; i < 2; i++) {
int newWheel = cur.wheel + dx[i];
if (newWheel >= 4 || newWheel < 0 || visit[newWheel]) continue;
visit[newWheel] = true;
if (i == 0 && wheel[cur.wheel][6] != wheel[newWheel][2]) {
searchQ.add(new Turn(newWheel, -cur.dir));
q.add(new Turn(newWheel, -cur.dir));
} else if (i == 1 && wheel[cur.wheel][2] != wheel[newWheel][6]) {
searchQ.add(new Turn(newWheel, -cur.dir));
q.add(new Turn(newWheel, -cur.dir));
}
}
}
while (!q.isEmpty()) {
Turn cur = q.poll();
turnWheel(cur.wheel, cur.dir);
}
}
public static void turnWheel(int wheelNum, int dir) {
int[] target = wheel[wheelNum];
if (dir == 1) {
int move = target[0];
for (int i = 0; i < 7; i++) {
int second = target[i + 1];
target[i + 1] = move;
move = second;
}
target[0] = move;
} else if (dir == -1) {
int move = target[7];
for (int i = 7; i > 0; i--) {
int second = target[i - 1];
target[i - 1] = move;
move = second;
}
target[7] = move;
}
// System.out.println(wheelNum);
// for (int i : wheel[wheelNum]) {
// System.out.print(i + " ");
// }
}
}
class Turn {
int wheel, dir;
public Turn(int wheel, int dir) {
this.wheel = wheel;
this.dir = dir;
}
}
반응형