백준 15662 톱니바퀴 (2) Gold V - JAVA 📌
https://www.acmicpc.net/problem/15662
문제 설명
문제 풀이
접근 💡
사실 이 문제는 엄청난 아이디어를 떠올려야 한다기 보다는 문제에서 주어진 조건 그대로 구현하면 되는 시뮬레이션 문제이다.
이 문제에 접근하기 위해 가장 중요하게 생각해야 하는 부분은 톱니바퀴가 회전하면 양 옆 톱니바퀴는 반대로 회전하게 된다는 것이다.
이 점을 활용하여 문제에 천천히 접근해보자.
우선 테스트케이스 1번을 살펴보자.
4개의 톱니바퀴가
10101111
01111101
11001110
0000010
으로 되어있다. 톱니바퀴의 12시부터 차례로 0, 1, 2 ... 인덱스가 부여된다.
우리가 살펴봐야 할 부분은 톱니바퀴가 맞물리는 2번 인덱스와 6번 인덱스이다.
현재 톱니바퀴가 시계방향으로 회전하면 오른쪽 톱니바퀴는 반시계 방향으로 회전하게 되는데, 오른쪽 톱니바퀴의 6번 인덱스와 현재 톱니바퀴의 2번 인덱스의 값이 달라야 회전할 수 있다. 만약 회전할 수 있다면 다음 오른쪽 톱니바퀴는 또 반시계의 반시계방향인 시계방향으로 회전하게 된다.
따라서 현재 회전한 톱니바퀴의 오른쪽, 왼쪽을 모두 검사 후 하나씩 회전시켜주면 모든 톱니바퀴가 회전한 최종 톱니바퀴의 상태가 도출된다. 코드로 살펴보자.
코드 💡
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int N, K, ans;
static int[][] wheels;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
wheels = new int[N][8];
for (int i = 0; i < N; i++) {
String str = br.readLine();
for (int j = 0; j < 8; j++) {
wheels[i][j] = str.charAt(j) - '0';
}
}
K = Integer.parseInt(br.readLine());
for (int i = 0; i < K; i++) {
st = new StringTokenizer(br.readLine());
int idx = Integer.parseInt(st.nextToken()) - 1;
int dir = Integer.parseInt(st.nextToken());
rotateLeft(idx - 1, -dir);
rotateRight(idx + 1, -dir);
rotate(idx, dir);
}
ans = 0;
for (int i = 0; i < N; i++) {
if (wheels[i][0] == 1) ans++;
}
System.out.println(ans);
}
private static void rotateLeft(int idx, int dir) {
if (idx < 0 || wheels[idx][2] == wheels[idx + 1][6]) {
return;
}
rotateLeft(idx - 1, -dir);
rotate(idx, dir);
}
private static void rotateRight(int idx, int dir) {
if (idx >= N || wheels[idx][6] == wheels[idx - 1][2]) {
return;
}
rotateRight(idx + 1, -dir);
rotate(idx, dir);
}
private static void rotate(int idx, int dir) {
if (dir == 1) {
int temp = wheels[idx][7];
for (int i = 7; i > 0; i--) {
wheels[idx][i] = wheels[idx][i - 1];
}
wheels[idx][0] = temp;
} else {
int temp = wheels[idx][0];
for (int i = 0; i < 7; i++) {
wheels[idx][i] = wheels[idx][i + 1];
}
wheels[idx][7] = temp;
}
}
}
'Algorithm' 카테고리의 다른 글
[백준] 18428 감시 피하기 - JAVA (1) | 2025.02.02 |
---|---|
[백준] 3980 선발 명단 - JAVA (0) | 2025.01.29 |
[백준] 2156 포도주 시식 -JAVA (0) | 2025.01.27 |
[백준] 2512 예산 - JAVA (0) | 2025.01.19 |
[알고리즘] Topological Sort - 위상 정렬 (2) | 2024.11.10 |