곽로그

[백준14891, Java] 톱니바퀴 본문

알고리즘/백준

[백준14891, Java] 톱니바퀴

일도이동 2020. 10. 7. 22:35
반응형

문제

www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터 �

www.acmicpc.net

 

보완해야하는

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