티스토리 뷰

Algorithm

[백준] S1 14891 톱니바퀴 (java)

코딩브론즈 2020. 12. 18. 13:48

www.acmicpc.net/problem/14891

 

14891번: 톱니바퀴

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

www.acmicpc.net

 

풀이

 

1) 톱니바퀴를 2번 저장할거임. 2차원 배열에 하나, Deque에 하나

2) 4개의 톱니바퀴가 돌아가는 상황을 분리하여 if문 노가다

3) 시계방향으로 돌아갈 경우 Deque의 맨 뒤 값을 맨 앞에다 넣고 반시계방향은 반대.

4) 한 사이클이 끝나면 2차원 배열을 초기화시켜줌

5) 모든 사이클이 끝나면 dq[0] + dq[1]*2 + dq[2]*4 + dq[3]*8 출력

 

 

 

주의사항

 

1) 방향 혼동 ㄴㄴ

 

package com.baekJoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class BJ_S1_14891_톱니바퀴 {
	static BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer tokens;
	static int K, wheel[][];
	static Deque<Integer> dq[] = new Deque[4];
	static Queue<Oper> queue = new LinkedList<>();
	public static void main(String[] args) throws NumberFormatException, IOException {
		input = new BufferedReader(new StringReader(src));
		for (int i=0; i<4; i++) {
			dq[i] = new ArrayDeque<>();
		}
		wheel = new int[4][8];
		for(int i=0; i<4; i++) {
			String line = input.readLine();
			for(int j=0; j<8; j++) {
				dq[i].offer(line.charAt(j)-'0');
				wheel[i][j] = line.charAt(j)-'0';
			}
		}
		K = Integer.parseInt(input.readLine());
		for(int k=0; k<K; k++) {
			tokens = new StringTokenizer(input.readLine());
			int no = Integer.parseInt(tokens.nextToken());
			int dir = Integer.parseInt(tokens.nextToken());
			queue.offer(new Oper(no, dir));
		}
		run();
		System.out.println(dq[0].poll()+dq[1].poll()*2+dq[2].poll()*4+dq[3].poll()*8);
	}
	private static void run() {
		while(!queue.isEmpty()) {
			Oper front = queue.poll();
			int dir = front.dir;
			switch (front.no) { // 몇번 톱니바퀴가 선택되었는가?
			case 1: // 첫번째 톱니바퀴를 돌릴경우
				if(dir == 1) { 
					Integer temp = dq[0].pollLast();
					dq[0].offerFirst(temp);
				}else { // 반시계방향
					Integer temp = dq[0].pollFirst();
					dq[0].offerLast(temp);
				}
				if(wheel[0][2] != wheel[1][6]) { // ㄱ 
					if(dir == 1) {
						Integer temp = dq[1].pollFirst(); //반시계방향
						dq[1].offerLast(temp);
					}else { 
						Integer temp = dq[1].pollLast(); //시계방향
						dq[1].offerFirst(temp);
					}
					if(wheel[1][2] != wheel[2][6]) { // ㄴ
						if(dir == 1) { // 시계방향
							Integer temp = dq[2].pollLast();
							dq[2].offerFirst(temp);
						}else { // 반시계방향
							Integer temp = dq[2].pollFirst();
							dq[2].offerLast(temp);
						}
						if(wheel[2][2] != wheel[3][6]) { // ㄷ
							if(dir == 1) { // 시계방향 이면 반시계방향
								Integer temp = dq[3].pollFirst();
								dq[3].offerLast(temp);
							}else { // 반시계방향 이면 시계방향
								Integer temp = dq[3].pollLast();
								dq[3].offerFirst(temp);
							}
						}
					}	
				}
				break;
			case 2:
				if(dir == 1) { // 시계방향
					Integer temp = dq[1].pollLast(); //시계방향
					dq[1].offerFirst(temp);
				}else { // 반시계방향
					Integer temp = dq[1].pollFirst(); //반시계방향
					dq[1].offerLast(temp);
				}
				if(wheel[0][2] != wheel[1][6]) { // ㄱ
					if(dir == 1) { // 시계방향
						Integer temp = dq[0].pollFirst(); //반시계방향
						dq[0].offerLast(temp);
					}else { // 반시계방향
						Integer temp = dq[0].pollLast(); //시계방향
						dq[0].offerFirst(temp);
					}
				}
				if(wheel[1][2] != wheel[2][6]) { // ㄴ
					if(dir == 1) { // 시계방향
						Integer temp = dq[2].pollFirst(); //반시계방향
						dq[2].offerLast(temp);
					}else { // 반시계방향
						Integer temp = dq[2].pollLast(); //시계방향
						dq[2].offerFirst(temp);
					}
					if(wheel[2][2] != wheel[3][6]) { // ㄷ
						if(dir == 1) { 
							Integer temp = dq[3].pollLast(); //시계방향
							dq[3].offerFirst(temp);
						}else {
							Integer temp = dq[3].pollFirst();  //반시계방향
							dq[3].offerLast(temp);
						}
					}
				}
				
				break;
			case 3:
				if(dir == 1) { // 시계방향
					Integer temp = dq[2].pollLast(); //시계방향
					dq[2].offerFirst(temp);
				}else { // 반시계방향
					Integer temp = dq[2].pollFirst(); //반시계방향
					dq[2].offerLast(temp);
				}
				if(wheel[2][2] != wheel[3][6]) { // ㄷ
					if(dir == 1) { 
						Integer temp = dq[3].pollFirst();  //반시계방향
						dq[3].offerLast(temp);
					}else {
						Integer temp = dq[3].pollLast(); //시계방향
						dq[3].offerFirst(temp);
					}
				}
				if(wheel[1][2] != wheel[2][6]) { // ㄴ
					if(dir == 1) { 
						Integer temp = dq[1].pollFirst();  //반시계방향
						dq[1].offerLast(temp);
					}else {
						Integer temp = dq[1].pollLast(); //시계방향
						dq[1].offerFirst(temp);
					}
					if(wheel[0][2] != wheel[1][6]) { // ㄱ
						if(dir == 1) { 
							Integer temp = dq[0].pollLast(); //시계방향
							dq[0].offerFirst(temp);
						}else {
							Integer temp = dq[0].pollFirst();  //반시계방향
							dq[0].offerLast(temp);
						}
					}
				}
				
				break;
			case 4:
				if(dir == 1) { // 시계방향
					Integer temp = dq[3].pollLast(); //시계방향
					dq[3].offerFirst(temp);
				}else { // 반시계방향
					Integer temp = dq[3].pollFirst(); //반시계방향
					dq[3].offerLast(temp);
				}
				if(wheel[2][2] != wheel[3][6]) { // ㄷ
					if(dir == 1) { 
						Integer temp = dq[2].pollFirst();  //반시계방향
						dq[2].offerLast(temp);
					}else {
						Integer temp = dq[2].pollLast(); //시계방향
						dq[2].offerFirst(temp);
					}
					if(wheel[1][2] != wheel[2][6]) { // ㄴ
						if(dir == 1) { 
							Integer temp = dq[1].pollLast(); //시계방향
							dq[1].offerFirst(temp);
						}else {
							Integer temp = dq[1].pollFirst();  //반시계방향
							dq[1].offerLast(temp);
						}
						if(wheel[0][2] != wheel[1][6]) { // ㄱ
							if(dir == 1) { 
								Integer temp = dq[0].pollFirst();  //반시계방향
								dq[0].offerLast(temp);
							}else {
								Integer temp = dq[0].pollLast(); //시계방향
								dq[0].offerFirst(temp);
							}
						}
					}
				}
				break;
			}
			for(int i=0; i<4; i++) { // 톱니바퀴 돌리기 
				for(int j=0; j<8; j++) {
					int temp = dq[i].pollFirst();
					wheel[i][j] = temp;
					dq[i].offerLast(temp);
				}
			}
		}
	}
	
	static class Oper{
		int no;
		int dir;
		public Oper(int no, int dir) {
			super();
			this.no = no;
			this.dir = dir;
		}
	}
	static String src =
			"10001011\r\n" + 
			"10000011\r\n" + 
			"01011011\r\n" + 
			"00111101\r\n" + 
			"5\r\n" + 
			"1 1\r\n" + 
			"2 1\r\n" + 
			"3 1\r\n" + 
			"4 1\r\n" + 
			"1 -1";
}

 

 

후기

 

실버이길래 과소평가했지만 생각보다 귀찮았던 구현문제였다.

코드를 써나가면서도 이게 맞나.. 싶을정도의 코드량 때문인지 상당히 비효율적으로 구현하고 있다는 느낌은 들었으나,

실행시간은 빠른편이라서 그냥 두었다. 두뇌운동하기에 적합한 난이도인것 같다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함