티스토리 뷰

Algorithm

[백준] S2 15662 톱니바퀴2 (java)

코딩브론즈 2020. 12. 20. 18:18

www.acmicpc.net/problem/15662

 

15662번: 톱니바퀴 (2)

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

www.acmicpc.net

 

풀이

 

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

2) Queue 에 입력된 (톱니바퀴 번호, 방향)정보를 담음

3) Queue가 빌때까지 꺼내면서 돌아가는지 체크함

3-1) 먼저 해당 번호를 true하고 왼쪽, 오른쪽 검사를 함

4) 배열 탐색하면서 true인 애들만 돌릴거임

4-1) |방향 - 인덱스| 가 짝수면 동일

4-2) |방향 - 인덱스| 가 홀수면 반대

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

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

5) 모든 사이클이 끝나면 dq[0].peek + dq[1].peek + dq[2].peek + ...... + dq[T-1].peek 출력

 

 

 

주의사항

 

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.Arrays;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class BJ_S2_15662_톱니바퀴2 {
	static BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
	static StringTokenizer tokens;
	static int T,K, wheel[][];
	static boolean canSpin[];
	static Deque<Integer> dq[];
	static Queue<Oper> queue = new LinkedList<>();
	public static void main(String[] args) throws NumberFormatException, IOException {
		input = new BufferedReader(new StringReader(src));
		T = Integer.parseInt(input.readLine());
		
		dq = new Deque[T];
		for (int i=0; i<T; i++) {
			dq[i] = new ArrayDeque<>();
		}
		wheel = new int[T][8];
		for(int i=0; i<T; 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())-1;
			int dir = Integer.parseInt(tokens.nextToken());
			queue.offer(new Oper(no, dir));
		}
		run();
		int result = 0;
		for(int i=0; i<dq.length; i++) {
			if(dq[i].peek() == 1) {
				result++;
			}
		}
		System.out.println(result);
	}
	private static void run() {
		while(!queue.isEmpty()) {
			canSpin = new boolean[T];
			Oper front = queue.poll();
			int dir = front.dir;
			int no = front.no;
			canSpin[no] = true;
			for(int i=no; i>0; i--) {
				if(wheel[i][6] != wheel[i-1][2]) {
					canSpin[i-1] = true;
				}else {
					break;
				}
			}
			for(int i=no; i<T-1; i++) {
				if(wheel[i][2] != wheel[i+1][6]) {
					canSpin[i+1] = true;
				}else {
					break;
				}
			}
			spin(no,dir);
		}
	}
	
	private static void spin(int no, int dir) {
		for(int i=0; i<T; i++) {
			if(canSpin[i]) {
				if(Math.abs(no - i)%2 == 0) { // dir과 같은방향
					if(dir == 1) { 
						Integer temp = dq[i].pollLast();
						dq[i].offerFirst(temp);
					}else { // 반시계방향
						Integer temp = dq[i].pollFirst();
						dq[i].offerLast(temp);
					}
				}else { // dir과 반대방향
					if(dir == 1) { 
						Integer temp = dq[i].pollFirst();
						dq[i].offerLast(temp);
					}else { // 반시계방향
						Integer temp = dq[i].pollLast();
						dq[i].offerFirst(temp);
					}
				}
			}
		}
		
		for(int i=0; i<T; 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 =
			"5\r\n" + 
			"10010011\r\n" + 
			"01010011\r\n" + 
			"11100011\r\n" + 
			"01010101\r\n" + 
			"01010011\r\n" + 
			"10\r\n" + 
			"1 1\r\n" + 
			"2 1\r\n" + 
			"3 1\r\n" + 
			"4 1\r\n" + 
			"1 -1\r\n" + 
			"2 -1\r\n" + 
			"3 -1\r\n" + 
			"4 -1\r\n" + 
			"5 1\r\n" + 
			"5 -1";
}

 

 

후기

 

전에 톱니바퀴1번 문제를 풀었을 때는 바퀴의 개수가 4개로 고정되어 하드코딩을 했지만 이번에는 T개여서 그럴 수 없었다. 애초에 이 문제를 더 일찍 풀었으면 더 좋았을 텐데... 여튼 구현 문제는 규칙을 찾는것이 중요하다고 느낀 문제였다.

'Algorithm' 카테고리의 다른 글

[백준] S4 20291 파일 정리 (java)  (0) 2020.12.21
[백준] G5 14499 주사위 굴리기 (java)  (0) 2020.12.20
[백준] S2 2290 LCD Test (java)  (0) 2020.12.20
[백준] S5 3568 iSharp (java)  (0) 2020.12.20
[백준] G3 2933 미네랄 (java)  (0) 2020.12.19
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함