반응형
개인적인 풀이일 뿐, 최적의 정답이 아님을 알려드립니다.
문제
난이도: 골드 5
사용언어: JAVA
풀이
비교적 간단한 구현 문제입니다. 저는 재귀를 이용해 각 톱니바퀴에서 오른쪽부터 모두 검사하고, 그 뒤에 왼쪽을 모두 검사하여 회전시켜야 할 톱니바퀴들만 마지막에 일괄적으로 회전시켜주는 형식으로 문제를 해결했습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | import java.io.*; import java.util.*; class Main { static int arr[][] = new int[5][8]; public static void gear_right(int n, int m) { // 오른쪽 톱니바퀴만 검사 if (n == 4) { // 4번 톱니바퀴면 더이상 확인할 필요 x } else { if (arr[n][2] != arr[n + 1][6]) { // 오른쪽 톱니바퀴와 극이 다르면 m = (m == 1) ? -1 : 1; // 회전 방향 바꿔주기 gear_right(n + 1, m); // 재귀를 통한 다음 톱니바퀴 확인 turn(n + 1, m); // 모든 확인이 끝난 뒤 회전 수행 } } } public static void gear_left(int n, int m) { // 왼쪽 톱니바퀴만 검사 if (n == 1) { // 1번 톱니바퀴면 더이상 확인할 필요 x } else { if (arr[n][6] != arr[n - 1][2]) { // 왼쪽 톱니바퀴와 극이 다르면 m = (m == 1) ? -1 : 1; gear_left(n - 1, m); turn(n - 1, m); } } } public static void turn(int n, int m) { // 톱니바퀴 회전 시키기 if (m == 1) { // 시계방향으로 회전 int temp = arr[n][7]; for (int i = 6; i >= 0; i--) { arr[n][i + 1] = arr[n][i]; } arr[n][0] = temp; } else { // 반시계방향으로 회전 int temp = arr[n][0]; for (int i = 1; i < 8; i++) { arr[n][i - 1] = arr[n][i]; } arr[n][7] = temp; } } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); String s; StringTokenizer st; int K; for (int i = 1; i <= 4; i++) { s = br.readLine(); for (int j = 0; j < 8; j++) { arr[i][j] = s.charAt(j) - '0'; } } K = Integer.parseInt(br.readLine()); for (int i = 0; i < K; i++) { st = new StringTokenizer(br.readLine()); int n = Integer.parseInt(st.nextToken()); int m = Integer.parseInt(st.nextToken()); if (n == 1) { // 1번 톱니바퀴는 오른쪽만 검사하면 됨 gear_right(n, m); turn(n, m); } else if (n == 4) { // 4번 톱니바퀴는 왼쪽만 검사하면 됨 gear_left(n, m); turn(n, m); } else { gear_right(n, m); gear_left(n, m); turn(n, m); } } int sum = 0; sum += arr[1][0] + arr[2][0] * 2 + arr[3][0] * 4 + arr[4][0] * 8; bw.write(String.valueOf(sum) + "\n"); bw.flush(); bw.close(); br.close(); } } | cs |
반응형
'백준 온라인 저지 > Gold' 카테고리의 다른 글
[BOJ] 20159 - 동작 그만. 밑장 빼기냐? (4) | 2021.04.18 |
---|---|
[BOJ] 20057 - 마법사 상어와 토네이도 (0) | 2021.04.13 |
[BOJ] 14499 - 주사위 굴리기 (0) | 2021.04.05 |
[BOJ] 6593 - 상범 빌딩 (0) | 2021.03.23 |
[BOJ] 9935 - 문자열 폭발 (0) | 2021.03.22 |