-
728x90
https://www.acmicpc.net/problem/14891
문제 풀이 방법
- 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; } }
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[1074] 백준 - Z(JAVA) (0) 2021.07.22 [17471] 백준 - 게리맨더링(JAVA) (0) 2021.03.15 [18868] 백준 - 멀티버스1(JAVA) (0) 2020.08.31 [18512] 백준 - 점프 점프(JAVA) (0) 2020.08.31 [10814] 백준 - 나이순 정렬(C++) (0) 2020.04.30 댓글