45일차 백준 (kotlin -> java 7일차)
14891번 톱니바퀴 4개 k번 회전시키기
딱 2시간 걸림. 집중이 너무 안돼… java 기본 문법도 너무 모르겠고 ㅠ_ㅠ 딱히 알고리즘이 적용된 건 아닌… 구현 문제
import java.util.*;
import java.io.*;
public class BJ_14891 {
static int[][] gear = new int[4][8];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int num = 0;
int direction = 0;
int score = 0;
for(int i=0; i<4; i++) {
gear[i] = br.readLine().chars().toArray();
}
int k = Integer.parseInt(br.readLine());
for(int i=0; i<k; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
num = Integer.parseInt(st.nextToken()) - 1;
direction = Integer.parseInt(st.nextToken());
rotate(num, direction, true, true);
}
for(int i=0; i<4; i++) {
// S극이면 +2^i
if(gear[i][0] == '1') {
score += Math.pow(2.0, i * 1.0);
}
}
System.out.println(score);
}
public static void rotate(int num, int direction, boolean left, boolean right) {
if (num > 0) {
if (gear[num][6] != gear[num - 1][2] && left == true) {
rotate(num - 1, direction * -1, true, false);
}
}
if (num < 3) {
if (gear[num][2] != gear[num + 1][6] && right == true) {
rotate(num + 1, direction * -1, false, true);
}
}
int[] temp = Arrays.copyOf(gear[num], gear[num].length);
if (direction == 1) {
for (int idx = 1; idx < 8; idx++) {
gear[num][idx] = temp[idx - 1];
}
gear[num][0] = temp[7];
} else {
for (int idx = 0; idx < 7; idx++) {
gear[num][idx] = temp[idx + 1];
}
gear[num][7] = temp[0];
}
}
}
이렇게 input 넣는게 최선인가?…
for(int i=0; i<4; i++) {
String line = br.readLine();
for(int j=0; j<8; j++) {
data[i][j] = line.charAt(j)-'0';
}
}
아 신기하다 나처럼 left right로 무한루프 방지한게 아니라 왼쪽도는거 오른쪽 도는거를 따로 했네
static void gearOperation(int idx, int dir) {
// 왼쪽 (0 ~ idx-1)
leftSide(idx-1, -dir);
// 오른쪽 (idx+1 ~ 3)
rightSide(idx+1, -dir);
rotation(idx,dir);
}
static void leftSide(int idx, int dir) {
if(idx < 0) return;
if(data[idx][2]==data[idx+1][6]) return;
leftSide(idx-1, -dir);
rotation(idx,dir);
}
static void rightSide(int idx, int dir) {
if(idx > 3) return;
if(data[idx][6] == data[idx-1][2]) return;
rightSide(idx+1, -dir);
rotation(idx,dir);
}
static void rotation(int idx, int dir) {
if(dir==1) {
int tmp = data[idx][7];
for(int i=7; i>0; i--) {
data[idx][i] = data[idx][i-1];
}
data[idx][0] = tmp;
}else {
int tmp = data[idx][0];
for(int i=0; i<7; i++) {
data[idx][i] = data[idx][i+1];
}
data[idx][7] = tmp;
}
}
Deque을 요소로 가지는 array로 갖고 싶었는데 이런 식으로 ArrayDeque 요소 4개 선언하고. new 객체 선언하면서 써야하나봄.
static ArrayList<Integer>[] t = new ArrayList[4];
for(int i=0; i<4; i++){
String[] tmp = br.readLine().split("");
t[i] = new ArrayList<>();
for(String e:tmp){
t[i].add(Integer.parseInt(e));
}
}