본문 바로가기
Problem Solving/BOJ

백준 -14891 톱니바퀴

by 채니_ 2021. 2. 16.

www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

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

www.acmicpc.net


메소드별 역할을 설계해서 재귀로 풀었다.

roll() : 톱니 회전

right() : 오른쪽 톱니 체크후 쉬프트

letf() : 왼쪽 톱니 체크후 쉬프트

swap() :  쉬프트

check() : 최종 톱니상태 점수 출력

print() : 톱니 출력

* 주의 * 왼쪽, 오른쪽 톱니의 상태를 비교 후 자신의 톱니상태를 변경해주어야 함.

-그렇지않으면 자신의 톱니상태가 변경된 후 왼쪽,오른쪽을 비교하게 되므로 틀림


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class 톱니바퀴 {
	static int arr[][];
	static int K;//회전횟수
	static int ans;//최종점수
	public static void main(String[] args) throws FileNotFoundException {
		System.setIn(new FileInputStream("input/톱니바퀴.txt"));
		Scanner sc = new Scanner(System.in);
		arr = new int[4][8];//톱니가 8개인 4개의 톱니바퀴
		for (int i = 0; i < 4; i++) {
			String str = sc.next();
			for (int j = 0; j < 8; j++) {
				arr[i][j] = str.charAt(j)-'0';
			}
		}
		K = sc.nextInt();//회전횟수
		for (int i = 0; i < K; i++) {
			int N = sc.nextInt()-1;//회전시킨 톱니바퀴의 번호 0~3
			int dir =sc.nextInt();//회전시킨 방향 -1(반시계 왼쪽쉬프트) or 1(시계 오른쪽쉬프트)
			roll(N,dir);//회전
		}
		check();//점수계산
		System.out.println(ans);
//		print();
	}
	private static void roll(int n, int dir) {
		//왼쪽돌리기
		left(n-1, -dir);
		//오른쪽돌리기
		right(n+1,-dir);
		//자기자신돌리기
		swap(n,dir);
	}

	private static void right(int n, int dir) {
	if(n>3) return;//톱니인덱스가 3보다 커지면 리턴
	if(arr[n][6]!=arr[n-1][2]) {//오른쪽의 6번쨰와 내꺼의2번째가 다르다면 오른쪽으로 더감
		right(n+1, -dir);//오른쪽으로 가주고
		swap(n,dir);//swap해줌
	}
		
	}
	private static void left(int n, int dir) {
		if(n<0) return;//톱니인덱스가 0보다 작으면 리턴
		if(arr[n][2]!=arr[n+1][6]) {//왼쪽의 2번째와 내꺼의 6이 다르다면 왼쪽으로 더감
			left(n-1,-dir);
			swap(n,dir);//왼쪽으로 가고나서 swap해줌
		}
		
	}
	private static void print() {//톱니상태체크함수
		for (int i = 0; i < 4; i++) {
			for (int j = 0; j < 8; j++) {
				System.out.print(arr[i][j]+" ");
			}System.out.println();
		}
	}
	private static void check() {//점수체크함수
		for (int i = 0; i < 4; i++) {
			 ans += arr[i][0] * (1<<i);
		}
		
	}
	private static void swap(int n,int dir) {//그냥 쉬프트연산만 수행 n: 현재 인덱스 dir:전거의방향
		if(dir==1) {//시계방향으로 회전시킨 경우 ->오른쪽쉬프트
			int temp = arr[n][7];
			for (int i = 7; i >=1; i--) {
				arr[n][i]=arr[n][i-1];
			}
			arr[n][0]=temp;
		}
		if(dir==-1){//반시계방향으로 회전시킨경우 <-왼쪽쉬프트
			int temp = arr[n][0];
			for (int i = 0; i <=6; i++) {
				arr[n][i]=arr[n][i+1];
			}
			arr[n][7]=temp;
		}
	}
}

 

 

 

'Problem Solving > BOJ' 카테고리의 다른 글

백준- 15686 치킨 배달  (0) 2021.02.18
백준 -2567 색종이2  (0) 2021.02.17
백준 3040 백설 공주와 일곱 난쟁이  (0) 2021.02.16
백준 2961 도영이가 만든 맛있는 음식  (0) 2021.02.15
백준- 2178 미로탐색  (0) 2021.02.14

댓글