728x90
백준 14891 - 톱니바퀴
https://www.acmicpc.net/problem/14891



문제
총 8개 톱니 가지고 있는 톱니바퀴 4개/ N극 or S극 중 하나 가지고 있음
총 K번 회전시키는데 서로 맞닿은 톱니 극이 다르면 반대방향으로 회전
입력
첫째 줄: 1번 톱니바퀴 상태
둘째 줄: 2번 톱니바퀴 상태
셋째 줄: 3번 톱니바퀴 상태
넷째 줄: 4번 톱니바퀴 상태
(8개의 정수로 12시 방향부터 시계방향 순서대로 주어짐/ N : 0, S : 1)
다섯째 줄: 회전 횟수 K (1 <= K <= 100)
다음 K개 줄: 회전시킨 방법 순서대로 주어짐
(첫 번째: 회전시킨 톱니바퀴 번호, 두 번째: 방향/ 1 : 시계, -1 : 반시계)
출력: 총 K번 회전시킨 이후에 네 톱니바퀴의 점수 합
1번 톱니바퀴의 12시 방향이 N -> 0점 / S -> 1점
2번 톱니바퀴의 12시 방향이 N -> 0점 / S -> 2점
3번 톱니바퀴의 12시 방향이 N -> 0점 / S -> 4점
4번 톱니바퀴의 12시 방향이 N -> 0점 / S -> 8점
풀이
`int[][] arr[i] = new int[4][8]`: 톱니바퀴 4개, 각 톱니 8개
- `arr[i][0]`: 12시 방향 톱니
- `arr[i][2]`: 3시 방향 (오른쪽)
- `arr[i][6]`: 9시 방향 (왼쪽)
- `arr[i][7]`: 11시 방향
`spin()`: 톱니바퀴 -> 시계/반시계로 회전
static void spin(int idx, int dir) {
if (dir == 1) {
int temp = arr[idx][7];
for (int i = 7; i > 0; i--) {
arr[idx][i] = arr[idx][i - 1];
}
arr[idx][0] = temp;
} else {
int temp = arr[idx][0];
for (int i = 0; i < 7; i++) {
arr[idx][i] = arr[idx][i + 1];
}
arr[idx][7] = temp;
}
}
`rotate()`: 인접한 톱니들까지 연쇄적으로 회전 방향 결정 후 한꺼번에 회전
- `int[] dirs = new int[4]`: 회전 방향 저장
- `dirs[i]`: 0 -> 회전 X / 1 -> 시계 / -1 -> 반시계
- 왼쪽 톱니 검사: for문 (idx - 1 ~ 0)
- `arr[i][2]`: 왼쪽(i) 톱니 3시 방향
- `arr[i + 1][6]`: 오른쪽 톱니 9시 방향
- 다르면 반대 방향으로 회전 / 같으면 회전 X
- 오른쪽 톱니 검사: for문 (idx + 1 ~ 3)
static void rotate(int idx, int dir) {
int[] dirs = new int[4];
dirs[idx] = dir;
for (int i = idx - 1; i >= 0; i--) {
if (arr[i][2] != arr[i + 1][6]) {
dirs[i] = -dirs[i + 1];
} else break;
}
for (int i = idx + 1; i < 4; i++) {
if (arr[i - 1][2] != arr[i][6]) {
dirs[i] = -dirs[i - 1];
} else break;
}
for (int i = 0; i < 4; i++) {
if (dirs[i] != 0) spin(i, dirs[i]);
}
}
코드
import java.io.*;
import java.util.*;
// 톱니바퀴
public class boj_14891 {
static int[][] arr;
static int K;
static void spin(int idx, int dir) {
if (dir == 1) {
int temp = arr[idx][7];
for (int i = 7; i > 0; i--) {
arr[idx][i] = arr[idx][i - 1];
}
arr[idx][0] = temp;
} else {
int temp = arr[idx][0];
for (int i = 0; i < 7; i++) {
arr[idx][i] = arr[idx][i + 1];
}
arr[idx][7] = temp;
}
}
static void rotate(int idx, int dir) {
int[] dirs = new int[4];
dirs[idx] = dir;
for (int i = idx - 1; i >= 0; i--) {
if (arr[i][2] != arr[i + 1][6]) {
dirs[i] = -dirs[i + 1];
} else break;
}
for (int i = idx + 1; i < 4; i++) {
if (arr[i - 1][2] != arr[i][6]) {
dirs[i] = -dirs[i - 1];
} else break;
}
for (int i = 0; i < 4; i++) {
if (dirs[i] != 0) spin(i, dirs[i]);
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
arr = new int[4][8];
for (int i = 0; i < 4; i++) {
String s = br.readLine();
for (int j = 0; j < 8; j++) {
arr[i][j] = s.charAt(j) - '0';
}
}
K = Integer.parseInt(br.readLine());
while (K-- > 0) {
StringTokenizer st = new StringTokenizer(br.readLine());
int num = Integer.parseInt(st.nextToken()) - 1;
int dir = Integer.parseInt(st.nextToken());
rotate(num, dir);
}
int score = 0;
if (arr[0][0] == 1) score += 1;
if (arr[1][0] == 1) score += 2;
if (arr[2][0] == 1) score += 4;
if (arr[3][0] == 1) score += 8;
System.out.println(score);
}
}728x90
반응형
'✏️ > BOJ' 카테고리의 다른 글
| [BOJ/Simulation] 백준 14499 - 주사위 굴리기 (Java) (0) | 2025.12.05 |
|---|---|
| [BOJ/Graph] 백준 1043 - 거짓말 (Java) (0) | 2025.12.04 |
| [BOJ/Graph] 백준 5214 - 환승 (Java) (0) | 2025.12.04 |
| [BOJ/PriorityQueue] 백준 1781 - 컵라면 (Java) (0) | 2025.12.01 |
| [BOJ/Floyd-Warshall] 백준 1507 - 궁금한 민호 (Java) (0) | 2025.11.28 |