ALGORITHM/프로그래머스 | 백준 | 삼성 | 카카오

[백준] 14891번 톱니바퀴

SZCODE 2020. 9. 13. 23:50

www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

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

www.acmicpc.net

문제 풀이 : 
톱니 바퀴를 k번만큼 회전시키는데 1은 시계방향이고, -1은 반시계 방향이다. n변수에 회전시킬 톱니바퀴 번호를 입력받는다.
dir 배열을 주어 회전방향을 결정해준다. wheel 배열은 톱니바퀴의 상태 배열이다.
rotat 함수방향을 결정해주는 함수로, 서로 맞닿은 톱니의 극이 다른 경우만 1과 -1을 넣어준다. 이후 회전방향대로 알맞는 함수를 호출한다.
right 함수 시계방향으로 돌아가는 함수이고, left 함수반시계방향으로 돌아가는 함수이다.
k번 만큼 실행해준 뒤 wheel 배열에서 톱니바퀴의 점수 합을 2의 제곱으로 처리하여 answer 변수에 넣어 답을 출력해준다.
import java.util.Scanner;

public class test2 {
	static int[][] wheel= new int[5][8];;
	static int k, answer=0;
	static int[] dir;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		for (int i = 1; i < 5; i++) {
			String s = sc.next();
			for (int j = 0; j < s.length(); j++) {
				wheel[i][j] = s.charAt(j) - 48;
			}
		}

		k = sc.nextInt();
		for (int i = 0; i < k; i++) {
			int n = sc.nextInt();//번호
			int d = sc.nextInt();//방향
			
			dir = new int[5];
			dir[n] = d;
			rotate(n);
		} // end of input
		
		for (int i = 1; i < 5; i++) {
			if(wheel[i][0] == 1) {
				answer+= Math.pow(2, i-1);
			}
		}
		System.out.println(answer);
		
	}// end of main

	public static void rotate(int n) {
		for (int i = n; i>=1; i--) {
			if(wheel[i][6] != wheel[i-1][2]) dir[i-1] = dir[i]*(-1);
			else break;
		}
		
		for(int i=n; i<4; i++) {
	        if(wheel[i][2] != wheel[i+1][6]) dir[i+1] = dir[i]*(-1);
	        else break;
	    }
		
		for (int i = 1; i < 5; i++) {
			if(dir[i] == 1) {
				right(i);
			}else if(dir[i] == -1) {
				left(i);
			}
		}
	}

	public static void right(int n) {// 시계
		int temp = wheel[n][7];

		for (int i = 7; i > 0; i--) {
			wheel[n][i] = wheel[n][i - 1];
		}

		wheel[n][0] = temp;
	}

	public static void left(int n) {// 반시계
		int temp = wheel[n][0];

		for (int i = 0; i < 7; i++) {
			wheel[n][i] = wheel[n][i + 1];
		}

		wheel[n][7] = temp;
	}

}// end of class