끄적끄적 코딩
article thumbnail

톱니바퀴가 규칙에 따라 움직일때 최종적으로 톱니의 위쪽들이 무엇인지 알아내는 문제입니다.

톱니가 맞닿은 부분이 서로 다르면 A톱니가 움직일때 B톱니도 움직이게 됩니다
A톱니가 시계방향으로 회전하면 B톱니는 반대 방향인 반시계방향으로 움직입니다
톱니가 움직여서 바뀐 수열에 대해서는 비트 연산으로 처리를 해주었습니다.

import java.util.Scanner;

public class Main {
  static int[] arr;
  public static void main(String args[]) {
    Scanner sc = new Scanner(System.in);
    arr = new int[4];
    int num;
    int cycle;
    int index, d, d2;
    int tmp;
    int l, r;
    int ans = 0;
    
    for(int i=0; i<4; ++i){
    	num = sc.nextInt();
    	for(int j=0; j<8; ++j) {
    		if(num % 10 == 1) {
    			arr[i] += (1 << j);
    		}
    		num /= 10;
    	}
    }

    cycle = sc.nextInt();
    for(int i=0; i<cycle; ++i){
      index = sc.nextInt() - 1;
      d = sc.nextInt();
      r = (arr[index] & 0B100000) >> 5;
      l = (arr[index] & 0B10) >> 1;
      rotation(index, d);
      
      d2 = d;
      for(int j=index+1; j<4; ++j) {
    	  if((((arr[j] & 0B10) >> 1) ^ r) == 0) {
    		 break; 
    	  }
    	  r = (arr[j] & 0B100000) >> 5;
    	  d2 *= -1;
    	  rotation(j, d2);
      }
      
      d2 = d;
      for(int j=index-1; j>=0; --j) {
    	  if((((arr[j] & 0B100000) >> 5) ^ l) == 0) {
     		 break; 
     	  }
     	  l = (arr[j] & 0B10) >> 1;
     	  d2 *= -1;
     	  rotation(j, d2);
      }
    }
    for(int i=0; i<4; ++i) {
    	if((arr[i] & 0B10000000) != 0) {
    		ans += (1 << i);
    	}
    }
    System.out.println(ans);
  }
  
  public static void rotation(int index, int d) {
	  int tmp;
	  if(d == -1){
      tmp = arr[index] >> 7;
      arr[index] = arr[index] << 1;
      arr[index] = arr[index] & 0B11111111;
      arr[index] = arr[index] | tmp;
    } else {
      tmp = arr[index] & 1;
      arr[index] = arr[index] >> 1;
      arr[index] = arr[index] | (tmp << 7);
    }
  }
}

 

'알고리즘' 카테고리의 다른 글

[Java] 백준 1260번 DFS와 BFS  (0) 2023.01.23
[Java] 백준 10845번 큐  (0) 2023.01.23
[Java] 백준 14889번 스타트와 링크  (0) 2023.01.19
[Java] 백준 18111번 마인크래프트  (0) 2023.01.19
[Java] 백준 3085번 사탕 게임  (2) 2023.01.18

검색 태그