본문 바로가기
Problem Solving/삼성 SW 역량 테스트 기출

백준 14891 : 톱니바퀴

by Libi 2021. 8. 2.
반응형

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

 

14891번: 톱니바퀴

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

www.acmicpc.net

[ 문제풀이 ]

전형적인 시뮬레이션 문제로써 정말 쉬운 문제이다.

회전할 톱니바퀴를 기준으로 좌우 측의 톱니바퀴의 회전 유무를 체크해 준 후 각 톱니바퀴를 회전시켜주기만 하면 간단하게 해결할 수 있다.

톱니바퀴를 다음과 같이 1차원 배열로 관리하자.

check라는 1차원 배열을 선언한 후 회전할 톱니바퀴를 기준으로 2, 6번 인덱스의 값을 비교해 주면서 회전이 가능한지, 가능하다면 시계(1)/반시계(-1) 방향을 체크해 주면 된다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;

public class Main {

	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

	static Gear[] gear;
	static int[] check; //i번 톱니바퀴를 어느 방향으로 돌릴것인지
	
	static class Gear {
		int[] map;
		
		public Gear() {
			map = new int[8];
		}
	}

	public static void main(String[] args) throws IOException {
		String[] str;
		gear = new Gear[4];
		check = new int[4];
		
		for (int i = 0; i < 4; ++i) {
			str = br.readLine().split("");
			gear[i] = new Gear();
			for (int j = 0; j < 8; ++j) {
				gear[i].map[j] = Integer.parseInt(str[j]);
			}
		}

		int K = Integer.parseInt(br.readLine());
		
		for (int i = 0; i < K; ++i) {
			str = br.readLine().split(" ");
			int idx = Integer.parseInt(str[0]) - 1; //0번부터 시작하기 위해
			int direct = Integer.parseInt(str[1]);
			checkIsRotate(idx, direct);
			rotateGear();
		}

		bw.write(getAnswer() + "\n");
		bw.flush();bw.close();br.close();
	}
	
	//0~3번 톱니바퀴가 시계/반시계 방향으로 회전이 가능한지 확인
	public static void checkIsRotate(int idx, int direct) {
		Arrays.fill(check, 0);
		
		check[idx] = direct;
		
		//idx기준 좌측 톱니바퀴
		for (int i = idx; i > 0; --i) {
			if (gear[i].map[6] == gear[i - 1].map[2]) break;
			check[i - 1] = -check[i];
		}

		//idx기준 우측 톱니바퀴
		for (int i = idx; i < 3; ++i) {
			if (gear[i].map[2] == gear[i + 1].map[6]) break;
			check[i + 1] = -check[i];
		}
	}
	
	public static void rotateGear() {
		for (int i = 0; i < 4; ++i) {
			if (check[i] == 0) continue;
			
			int temp = gear[i].map[0];
			
			//반시계 방향으로 회전
			if (check[i] == -1) {
				for (int j = 1; j < 8; ++j) {
					gear[i].map[j - 1] = gear[i].map[j];
				}
				gear[i].map[7] = temp;
			} 
			//시계 방향으로 회전
			else {
				for (int j = 7; j >= 1; --j) {
					gear[i].map[(j + 1) % 8] = gear[i].map[j];
				}
				gear[i].map[1] = temp;
			}
		}
	}
	
	public static int getAnswer() {
		int answer = 0;
		
		for (int i = 0; i < 4; ++i) {
			if (gear[i].map[0] == 1) {
				answer += 1 << i;
			}
		}
		
		return answer;
	}
}
반응형

댓글