본문 바로가기

알고리즘

[BOJ] BOJ 14891. 톱니바퀴 (JAVA)

https://www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴

www.acmicpc.net

<문제>

톱니바퀴를 회전시키려면, 회전시킬 톱니바퀴와 회전시킬 방향을 결정해야 한다. 톱니바퀴가 회전할 때, 서로 맞닿은 극에 따라서 옆에 있는 톱니바퀴를 회전시킬 수도 있고, 회전시키지 않을 수도 있다. 톱니바퀴 A를 회전할 때, 그 옆에 있는 톱니바퀴 B와 서로 맞닿은 톱니의 극이 다르다면, B는 A가 회전한 방향과 반대방향으로 회전하게 된다.

 

<풀이>

1. 맞닿은 톱니의 극을 확인할 때에는 2번, 6번 인덱스를 활용하였다.

  • 왼쪽 톱니바퀴 번호가 0보다 같거나 크고, 왼쪽 톱니바퀴의 6번 톱니가 해당 톱니바퀴의 2번 톱니와 반대이고 왼쪽 톱니바퀴를 회전시킨적이 없다면 왼쪽 톱니바퀴를 반대방향으로 회전시킨다.
  • 오른쪽 톱니바퀴 번호가 3보다 같거나 작고, 오른쪽 톱니바퀴의 2번 톱니가 해당 톱니바퀴의 6번 톱니와 반대이고, 오른쪽 톱니바퀴를 회전시킨 적이 없다면 오른쪽 톱니바퀴를 해당 톱니바퀴의 반대방향으로 회전시킨다.

2. 톱니바퀴 회전 여부를 확인하기 위해 visited 배열을 생성하였다.

3. 최종적으로 톱니의 12시 방향의 극을 이용하여 점수를 계산하기 때문에 0번 인덱스에 각각 1, 2, 4, 8을 곱해 점수를 계산하였다. (N극은 0, S극은 1로 표현되므로)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BOJ14891 {
	
	static int[][] gear = new int[4][8];
	static void start(int n, int d, boolean[] v) {
		v[n]=true;
		
		int left = n-1;
		int right = n+1;
		if(left>=0 && (gear[left][2]!=gear[n][6]) && !v[left]) {
			start(left,d*(-1),v);
		}
		if(right<=3 && (gear[right][6]!=gear[n][2]) && !v[right]) {
			start(right,d*(-1),v);
		}
		
		move(n,d);
	}
	
	static void move(int n, int d) {
		int[] temp = new int[8];
		if(d ==1) {
			for(int i =0;i<=6;i++) {
				temp[i+1] =  gear[n][i];
			}
			temp[0]=gear[n][7];
		}
		else {
			for(int i=1;i<=7;i++) {
				temp[i-1] = gear[n][i];
			}
			temp[7] = gear[n][0];
		}
		
		for(int i =0; i<temp.length;i++) {
			gear[n][i] = temp[i];
		}
	}
	
	public static void main(String[] args) throws Exception, IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		for(int i=0;i<4;i++) {
			String[] line = br.readLine().split("");
			for(int j=0;j<8;j++) {
				gear[i][j]=Integer.parseInt(line[j]);
			}
		}
		
		int K = Integer.parseInt(br.readLine());
		int gearNum;
		int direction;
		for(int i=0;i<K;i++) {
			st = new StringTokenizer(br.readLine());
			gearNum = Integer.parseInt(st.nextToken());
			direction = Integer.parseInt(st.nextToken());
			
			boolean[] visited = new boolean[4];
			start(gearNum-1, direction, visited);
		}
		int total = 0;
		total += gear[0][0]*1;
		total += gear[1][0]*2;
		total += gear[2][0]*4;
		total += gear[3][0]*8;
		
		System.out.println(total);

		
	}
}

<느낀점>

구현을 귀찮아하지 말자 제발!

'알고리즘' 카테고리의 다른 글

[BOJ] 1254. 팰린드롬 만들기 (JAVA)  (0) 2022.03.31
[BOJ] BOJ 15486. 퇴사2 (JAVA)  (0) 2022.03.07
[BOJ] BOJ 11000. 강의실배정 (JAVA)  (0) 2022.03.04
[BOJ] BOJ 1969. DNA (JAVA)  (0) 2022.03.03
[BOJ] BOJ 1946.신입사원 (JAVA)  (0) 2022.03.03