곽로그
[백준14891, Java] 톱니바퀴 본문
반응형
문제
보완해야하는 점
1) 문제이해
- 처음 문제를 어떻게 이해하는지가 매우매우매우매우 중요! 잘못이해하고 풀면 시간은 시간대로 멘탈은 멘탈대로 나간다.
- 내가 잘못 이해한 부분은 " 톱니바퀴 A를 회전할 때, 그 옆에 있는 톱니바퀴 B와 서로 맞닿은 톱니의 극이 다르다면, B는 A가 회전한 방향과 반대방향으로 회전하게 된다" 인데 회전한 다음에 마주한 바퀴의 극을 비교해야하는데 회전하기 전 처음 상태의 극을 비교했다. 이것때매 1시간 날린 것 같다.
2) 일반화하기!
- 처음 문제를 풀면서 어려웠던 점은 연쇄적으로 바퀴회전이 일어나는 부분이었다. A가 회전하는데 B가 극이 안맞으면 B도 회전하고 그 옆에 C도 ~~ 이렇게 나가는 부분.
하나의 바퀴를 기준 일반화를 하면 조금 쉽게 풀린다. 그리고 재귀!
코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static int[][] gear = new int[4][8];
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
for(int row = 0; row<gear.length;row++) {
String[] line = br.readLine().split("");
for(int column=0;column<line.length;column++) {
gear[row][column] = Integer.parseInt(line[column]);
}
}
int K;
int gearNumber;
int direction;
st = new StringTokenizer(br.readLine());
K =Integer.parseInt(st.nextToken());
for(int count = 0; count<K ; count++) {
st = new StringTokenizer(br.readLine());
gearNumber = Integer.parseInt(st.nextToken());
direction = Integer.parseInt(st.nextToken());
boolean[] visited = new boolean[4];
round(gearNumber-1,direction,visited);
}
bw.write(String.valueOf(getScore()));
bw.flush();
}
public static void round(int currentGear, int direction, boolean[] isRounded) {
isRounded[currentGear] = true;
int leftGear = currentGear-1;
int rightGear = currentGear+1;
if(leftGear>=0 && (gear[leftGear][2]!=gear[currentGear][6]) && !isRounded[leftGear]) {
round(leftGear,direction*(-1),isRounded);
}
if(rightGear<=3 && (gear[rightGear][6]!=gear[currentGear][2]) && !isRounded[rightGear]) {
round(rightGear,direction*(-1),isRounded);
}
move(currentGear,direction);
}
public static void move(int gearNumber, int direction) {
int[] temp = new int[8];
if(direction ==1) {
for(int column =0;column<=6;column++) {
temp[column+1] = gear[gearNumber][column];
}
temp[0]=gear[gearNumber][7];
}
else {
for(int column=1;column<=7;column++) {
temp[column-1] = gear[gearNumber][column];
}
temp[7] = gear[gearNumber][0];
}
for(int index =0; index<temp.length;index++) {
gear[gearNumber][index] = temp[index];
}
}
public static int getScore() {
int total = 0;
total += gear[0][0]*1;
total += gear[1][0]*2;
total += gear[2][0]*4;
total += gear[3][0]*8;
return total;
}
public static void print() {
for(int row=0;row<gear.length;row++) {
for(int column = 0 ; column<gear[row].length; column++) {
System.out.print(gear[row][column]);
}
System.out.println();
}
}
}
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준 12100, Java] 2046(easy) (0) | 2020.10.14 |
---|---|
[백준 16236,Java] 아기상어 (0) | 2020.10.11 |
[백준 16928, Java] 뱀과 사다리게임 (0) | 2020.10.07 |
[백준 14530, Java] 로봇청소기 (0) | 2020.09.29 |
[백준 14502, Java] 연구소 (0) | 2020.09.28 |
Comments