알고리즘/BAEKJOON
[백준] 14891 톱니바퀴 (Java)
kyeee2
2022. 4. 17. 02:13
[14891 톱니바퀴]
난이도: 골드5
14891번: 톱니바퀴
첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터
www.acmicpc.net
문제
입력
출력
[아이디어]
톱니바퀴를 돌릴 때 재귀를 활용하였다. 왼쪽 톱니바퀴가 회전하는지를 판단할 때는 아래와 같이 코드를 작성하였다.
// 왼쪽 톱니바퀴 회전 여부 판단
if(gear > 1 && !visited[gear - 1] && gears[gear][6] != gears[gear - 1][2]) { // 맞닿은 톱니의 극이 다르다면 rotate(gear - 1, dir * -1); // 왼쪽 톱니바퀴를 dir * -1 반대 방향으로 회전시키기
}
gear > 1 은 첫번째 톱니는 왼쪽에 톱니바퀴가 없기 때문이다.
먼저 톱니를 변화시키고 이웃한 톱니의 회전 가능성을 체크하면 오답이기 때문에 이웃한 톱니의 회전 가능성들을 체크한 뒤에 톱니의 상태를 변화시켜주었다.
마지막 톱니바퀴의 점수의 합을 구할 때 N극은 배열에 0으로, S극은 배열에 1로 표시되기 때문에 i번째 기어의 상태와 2^(i-1) 를 곱해주었다.
for(int i = 1; i <= 4; i++) {
sum += gears[i][0] * (1 << (i - 1)); // 2 ^ (i - 1)
}
[JAVA 코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer tokens;
static int [][] gears = new int [5][8];
static boolean [] visited;
static int K;
public static void main(String[] args) throws IOException {
// 기어 상태 입력
for(int i = 1; i <= 4; i++) {
String line = br.readLine();
for(int j = 0; j < 8; j++) {
gears[i][j] = line.charAt(j) - '0';
}
}
K = Integer.parseInt(br.readLine());
for(int i = 0; i < K; i++) {
tokens = new StringTokenizer(br.readLine());
int gear = Integer.parseInt(tokens.nextToken()); // 회전시킨 톱니바퀴 번호
int dir = Integer.parseInt(tokens.nextToken()); // 방향
visited = new boolean[5];
rotate(gear, dir);
}
int sum = 0;
for(int i = 1; i <= 4; i++) {
sum += gears[i][0] * (1 << (i - 1));
}
System.out.println(sum);
}
private static void rotate(int gear, int dir) {
visited[gear] = true;
// 왼쪽 톱니바퀴 회전 여부 판단
if(gear > 1 && !visited[gear - 1] && gears[gear][6] != gears[gear - 1][2]) {
// 맞닿은 톱니의 극이 다르다면
rotate(gear - 1, dir * -1);
}
// 오른쪽 톱니바퀴 회전 여부 판단
if(gear < 4 && !visited[gear + 1] && gears[gear][2] != gears[gear + 1][6]) {
// 맞닿은 톱니의 극이 다르다면
rotate(gear + 1, dir * -1);
}
if(dir == 1) {
// 시계방향 회전
int temp = gears[gear][7];
for(int i = 6; i >= 0; i--) {
gears[gear][i + 1] = gears[gear][i];
}
gears[gear][0] = temp;
} else if(dir == -1) {
// 반시계방향 회전
int temp = gears[gear][0];
for(int i = 0; i < 7; i++) {
gears[gear][i] = gears[gear][i + 1];
}
gears[gear][7] = temp;
}
}
}