최's 먹공로그
BOJ14891_톱니바퀴 본문
https://www.acmicpc.net/problem/14891
문제요약
1. 톱니의 상태가 12시 방향부터 주어진다. (0은 N극 , 1은 S극)
2. 몇번 회전할지 주어지고(K) , 회전시킬 톱니 번호와 방향(1은 시계방향 , -1은 반시계방향)이 주어진다.
3. 번호에 해당하는 톱니를 A라고 하고 옆에 있는 톱니를 B라고 했을 때 돌리기 전에 옆에 있는 톱니와 맞닿은
곳의 극이 다르면 A톱니의 방향과 반대로 B톱니가 회전한다.
4. K번 회전이 끝난 후 1번 톱니의 12시방향이 S극이면 1점
2번은 2점 , 3번은 4점 , 4번은 8점으로 해서 총 합을 출력한다.
문제 issue
1. 맞닿은 곳을 어떤식으로 표현?? - 12시 방향을 0번 인덱스로 뒀을 때 톱니끼리 2번 혹은 6번이 맞닿는 곳이다.
2. 회전하지 않는 톱니라면 그 옆은 볼 필요가 없다.
해결흐름
1. 회전시킬 톱니번호로 가장크게 분류한다.
2. 회전시킬 톱니번호를 먼저 회전 해주기 전에 옆에 톱니와 맞닿은 곳의 극이 다른지를 먼저 검사한다.
3. 계속해서 옆에 톱니랑 맞닿은 곳의 극이 다른지를 먼저 검사하고 끝에 톱니부터 l_rotate 또는 r_rotate 해준다.
4. rotate는 q를 이용해서 해준다.
5. K번의 회전이 끝난 후 각 톱니의 12시 방향의 극을 검사하고 S극이면 sum에 더해준다.
소스코드
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 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; public class Main { private static int[][] wheel; private static int sum; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); wheel = new int[5][8]; for (int i = 0; i < 4; i++) { String s = br.readLine().trim(); for (int j = 0; j < s.length(); j++) { wheel[i+1][j] = s.charAt(j) - '0'; } } int K = Integer.parseInt(br.readLine().trim()); for (int i = 0; i < K; i++) { StringTokenizer st = new StringTokenizer(br.readLine().trim(), " "); int wheel_num = Integer.parseInt(st.nextToken()); int dir = Integer.parseInt(st.nextToken()); // wheel_num에 따라서 양옆에 톱니가 있는지 보고 극이 다른지 확인 if(wheel_num == 1) { // wheel_num에 해당하는 톱니를 먼저 돌려주기 전에 옆에 있는 톱니와 맞닿은 곳이 서로 다른 극인지 먼저 검사 해줘야 한다 if(wheel[1][2] != wheel[2][6]) { if(wheel[2][2] != wheel[3][6]) { if(wheel[3][2] != wheel[4][6]) { if(dir == 1) { r_rotate(4); } else if(dir == -1) { l_rotate(4); } } if(dir == 1) { l_rotate(3); } else if(dir == -1) { r_rotate(3); } } if(dir == 1) { r_rotate(2); } else if(dir == -1) { l_rotate(2); } } if(dir == 1) { l_rotate(1); } else if(dir == -1) { r_rotate(1); } } else if(wheel_num == 2) { if(wheel[2][6] != wheel[1][2]) { if(dir == 1) { r_rotate(1); } else if(dir == -1) { l_rotate(1); } } if(wheel[2][2] != wheel[3][6]) { if(wheel[3][2] != wheel[4][6]) { if(dir == 1) { l_rotate(4); } else if(dir == -1) { r_rotate(4); } } if(dir == 1) { r_rotate(3); } else if(dir == -1) { l_rotate(3); } } if(dir == 1) { l_rotate(2); } else if(dir == -1) { r_rotate(2); } } else if(wheel_num == 3) { if(wheel[3][6] != wheel[2][2]) { if(wheel[2][6] != wheel[1][2]) { if(dir == 1) { l_rotate(1); } else if(dir == -1) { r_rotate(1); } } if(dir == 1) { r_rotate(2); } else if(dir == -1) { l_rotate(2); } } if(wheel[3][2] != wheel[4][6]) { if(dir == 1) { r_rotate(4); } else if(dir == -1) { l_rotate(4); } } if(dir == 1) { // 회전할 톱니 번호만 넘겨주자 l_rotate(3); } else if(dir == -1) { r_rotate(3); } } else if(wheel_num == 4) { if(wheel[4][6] != wheel[3][2]) { if(wheel[3][6] != wheel[2][2]) { if(wheel[2][6] != wheel[1][2]) { if(dir == 1) { r_rotate(1); } else if(dir == -1) { l_rotate(1); } } if(dir == 1) { l_rotate(2); } else if(dir == -1) { r_rotate(2); } } if(dir == 1) { r_rotate(3); } else if(dir == -1) { l_rotate(3); } } if(dir == 1) { l_rotate(4); } else if(dir == -1) { r_rotate(4); } } // for (int k = 0; k < wheel.length; k++) { // System.out.println(Arrays.toString(wheel[k])); // } sum = 0; for (int j = 1; j <= 4; j++) { if(j == 1) { if(wheel[j][0] == 1) { sum += 1; } } else if(j == 2) { if(wheel[j][0] == 1) { sum += 2; } } else if(j == 3) { if(wheel[j][0] == 1) { sum += 4; } } else if(j == 4) { if(wheel[j][0] == 1) { sum += 8; } } } } System.out.println(sum); } // end of main private static void l_rotate(int wheel_num) { Queue<Integer> q = new LinkedList<Integer>(); for (int i = 0; i < 8; i++) { q.add(wheel[wheel_num][i]); } for (int i = 1; i < 8; i++) { wheel[wheel_num][i] = q.poll(); } wheel[wheel_num][0] = q.poll(); } private static void r_rotate(int wheel_num) { Queue<Integer> q = new LinkedList<>(); for (int i = 7; i >= 0; i--) { q.add(wheel[wheel_num][i]); } for (int i = 6; i >= 0; i--) { wheel[wheel_num][i] = q.poll(); } wheel[wheel_num][7] = q.poll(); } } // end of class | cs |
'APS' 카테고리의 다른 글
BOJ2146_다리만들기 (0) | 2019.06.09 |
---|---|
BOJ17281_야구 (0) | 2019.06.09 |
BOJ14499_주사위굴리기 (0) | 2019.06.03 |
BOJ2980_도로와신호등 (0) | 2019.05.29 |
BOJ17143_낚시왕 (2) | 2019.05.09 |