- 메모리 : 13,088 KB
- 시간 : 80 ms
- 코드길이 : 1,935 B
- 소요시간 : 1H
- [SWEA] 4013. 특이한 자석과 같은 문제이다. 저번에 풀었던 풀이를 보지 않고 다시 풀었는데 푸는 시간은 반으로 줄었고 코드도 훨씬 나아진 것 같다. 시간도 줄었고 메모리 부분도 효율성이 높아졌다. 다만, 이차원 배열을 쓰지 않고 일차원 배열에 넣으려고 하다보니 내가 정의한 cnt, size를 바꿔쓰면서 계산하다보니 자잘한 실수가 많아서 시간이 좀 걸린 것 같다. 시험볼때는 그냥 간단하게 이차원배열로 푸는게 빠를 것 같다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main_B_14891_톱니바퀴 {
static int cnt = 4, size = 8, K, n, dir;
static int[] wheel = new int[cnt * size];
static int[] wheelDir = new int[cnt];
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
String tmp;
for (int i = 0; i < cnt; i++) {
tmp = in.readLine();
for (int j = 0; j < size; j++) {
wheel[size * i + j] = tmp.charAt(j) - '0';
}
}
K = Integer.parseInt(in.readLine());
for (int i = 0; i < K; i++) {
st = new StringTokenizer(in.readLine());
n = Integer.parseInt(st.nextToken()) - 1;
dir = Integer.parseInt(st.nextToken());
simul(n, dir);
rotate();
Arrays.fill(wheelDir, 0);
}
// N극은 0, S극은 1
int answer = 0;
for (int i = 0; i < cnt; i++) {
answer += wheel[size * i] * Math.pow(2, i);
}
System.out.println(answer);
in.close();
} // end main
private static void rotate() {
int first, last;
for (int i = 0; i < cnt; i++) {
if (wheelDir[i] == 1) { // 시계방향 회전
last = wheel[size * i + (size - 1)];
for (int j = size * i + (size - 1); j > size * i; j--) {
wheel[j] = wheel[j - 1];
}
wheel[size * i] = last;
} else if (wheelDir[i] == -1) { // 반시계방향 회전
first = wheel[size * i];
for (int j = size * i; j < size * i + (size - 1); j++) {
wheel[j] = wheel[j + 1];
}
wheel[size * i + (size - 1)] = first;
}
}
}
private static void simul(int n, int dir) {
if (wheelDir[n] != 0)
return;
wheelDir[n] = dir;
if (n > 0 && wheel[n * size + 6] != wheel[(n - 1) * size + 2])
simul(n - 1, dir * (-1));
if (n < cnt - 1 && wheel[n * size + 2] != wheel[(n + 1) * size + 6])
simul(n + 1, dir * (-1));
}
}
Leave a comment