알고리즘 풀이/백준
[14891] 백준 - 톱니바퀴(JAVA)
데롱디롱
2021. 3. 14. 21:17
728x90
https://www.acmicpc.net/problem/14891
14891번: 톱니바퀴
총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴
www.acmicpc.net
문제 풀이 방법
- n : 회전할 톱니바퀴 번호, d : 회전 방향
- n왼쪽으로 하나씩 이동하면서 [n-j-1]번 톱니바퀴의 2번과 [n-j]번 톱니바퀴의 6번이 서로 다른 경우,
회전해야하므로 isTurn에 회전 방향을 기록해 나간다.
- [n-j-1]번 톱니바퀴의 2번과 [n-j]번 톱니바퀴의 6번이 같은 경우, 더이상 회전하지 않으므로 break
- 오른쪽도 왼쪽과 같은 방법으로 탐색하면서 isTurn을 완성한다.
- isTurn을 순회하며 -1은 반시계방향, 1은 시계방향으로 회전시켜준다.
- 위의 방법을 K번 반복한다.
- K번 반복이 끝나면, 각 톱니 바퀴의 0번째 자리가 S극(즉, 1)인지 확인하여 점수에 더해준다.
소스 코드
package com.boj.silver1;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class 백준_14891_톱니바퀴 {
static int wheels[][];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
wheels = new int[4][8]; // 톱니바퀴 상태 입력
for (int i = 0; i < 4; i++) {
String s = br.readLine();
for (int j = 0; j < 8; j++) {
wheels[i][j] = s.charAt(j) - '0';
}
}
int K = Integer.parseInt(br.readLine());
for (int i = 0; i < K; i++) {
st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken()) - 1; // 회전할 톱니 번호
int d = Integer.parseInt(st.nextToken()); // 회전 방향
int isTurn[] = new int[4]; // 회전 여부 저장
isTurn[n] = d;
// n 왼쪽
for (int j = 0; n != 0 && j < n; j++) {
if (wheels[n - j][6] != wheels[n - j - 1][2])
isTurn[n - j - 1] = j % 2 == 0 ? -d : d; // j가 짝수면 다른 방향, 홀수면 같은 방향
else
break;
}
// n 오른쪽
for (int j = 0; n != 3 && j < 4 - n - 1; j++) {
if (wheels[n + j][2] != wheels[n + j + 1][6])
isTurn[n + j + 1] = j % 2 == 0 ? -d : d; // j가 짝수면 다른 방향, 홀수면 같은 방향
else
break;
}
// 회전
for (int j = 0; j < 4; j++) {
if (isTurn[j] == 1) // 시계방향 회전
goTurn(j);
else if (isTurn[j] == -1) // 반시계방향 회전
goBack(j);
}
}
int result = 0; // 점수
for (int i = 0; i < 4; i++) {
if(wheels[i][0] == 1)
result += Math.pow(2, i); // i번째 톱니바퀴 점수 : 2^i
}
System.out.println(result);
}
// 반시계방향
private static void goBack(int n) {
int temp = wheels[n][0];
for (int i = 0; i <= 6; i++)
wheels[n][i] = wheels[n][i + 1];
wheels[n][7] = temp;
}
// 시계방향
private static void goTurn(int n) {
int temp = wheels[n][7];
for (int i = 6; i >= 0; i--)
wheels[n][i + 1] = wheels[n][i];
wheels[n][0] = temp;
}
}