Step-by-Step

[Java] 백준14891 - 톱니바퀴 본문

언어/JAVA

[Java] 백준14891 - 톱니바퀴

희주(KHJ) 2022. 10. 20. 00:10

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

 

14891번: 톱니바퀴

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

www.acmicpc.net

 

와 .. 노트에 열심히 풀어가면서 썼던 문제ㅋㅋㅋ

가장 중요한 건 톱니바퀴 4개는 동시에 돌아간다는 것이다!!!

나는 2번째 톱니바퀴가 돌면.. 양 옆으로 한개씩 보고 돌릴지 안돌릴지 판단하고 구현했는데,

테케가 다 틀려서 몹시 당황했다.. 동시에 돌아가는것만 잘 알면 금방 풀릴듯!

 

 

각 톱니 데이터는 2차원 배열로 만들어서 저장해뒀고, 

12시 방향이나 3시,9시 방향은 idx로 저장해서 반시계는 idx+1 시계는 idx-1 이런식으로 구현했다.

※ 반시계로 돌리면 다음 인덱스값이 나오니까 헷갈리지 말기!

※ 시계, 반시계 값은 1 , -1 이고 실제 인덱스 값은 idx -1 , idx + 1로 반대여서 헷갈렸다.

 

 

package BOJ_SS;

import java.util.*;

public class boj14891 {
   public static int[][] wheel;
   public static int[][] idx;
   public static int[] dirs;
   public static boolean[] isRot;
   
   public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      
      wheel = new int[4][8];
      idx = new int[4][2];
      
      for(int i=0; i<4; i++) {
         String str = sc.nextLine();
         for(int j=0; j<8; j++)
            wheel[i][j] = str.charAt(j) - '0';
          
         // 오른쪽 인덱스 2 , 왼쪽 인덱스 6
         idx[i][0] = 2;
         idx[i][1] = 6;
      }
      
      int k = sc.nextInt();
      for(int i=0; i<k; i++) {
         int n = sc.nextInt()-1;
         int dir = sc.nextInt();
         
         checkRot(n, dir);
         
         for(int j=0; j<4; j++) {
        	 if(isRot[j])
        		 rot(j);
         }
      }
      System.out.println(totScore());
   }
   
   public static void checkRot(int n, int dir) {
	   isRot = new boolean[4];
	   dirs = new int[4];
	   // n이 짝수
	   // dir 값 : 1 시계방향 -1 반시계방향
	   if(n%2==0) {
		   dirs[0]=dir;
		   dirs[2]=dir;
		   
		   dirs[1]=-dir;
		   dirs[3]=-dir;
	   }else {
		   dirs[0]=-dir;
		   dirs[2]=-dir;
		   
		   dirs[1]=dir;
		   dirs[3]=dir;
	   }
	   
	   // 오른쪽 idx[n][0]
	   // 왼쪽 idx[n][1]
	   
	   isRot[n]=true;
	   
	   boolean notRot = false;
	   for(int i=n-1; i>=0; i--) {
		   if(notRot) {
			   isRot[i] = false;
			   continue;
		   }
			   
		   if(wheel[i][idx[i][0]]==wheel[i+1][idx[i+1][1]]) {
			   isRot[i] = false;
			   notRot = true;
		   } else {
			   isRot[i] = true;
		   }
			   
	   }
	   
	   notRot = false;
	   
	   for(int i=n+1; i<4; i++) {
		   if(notRot) {
			   isRot[i] = false;
			   continue;
		   }
			   
		   if(wheel[i][idx[i][1]]==wheel[i-1][idx[i-1][0]]) {
			   isRot[i] = false;
			   notRot = true;
		   } else {
			   isRot[i] = true;
		   }
	   }
   }
   
   public static void rot(int n) {
	   /* dir 값 */
	   // 시계방향 회전 : 1 
	   // 반시계방향 회전 : -1
	   
	   /* idx 값 */
	   // 시계방향 회전 : -1 
	   // 반시계방향 회전 : +1
	   
	   int dir = dirs[n];
	   
	   if(dir == -1) {
		   idx[n][0] = (idx[n][0]+1) % 8;
		   idx[n][1] = (idx[n][1]+1) % 8;
	   } else {
		   idx[n][0] = (idx[n][0]+7) % 8;
		   idx[n][1] = (idx[n][1]+7) % 8;
	   }
   }
   
   public static int totScore() {
	   int res = 0;
	   
	   for(int i=0; i<4; i++) {
		   int left = idx[i][1];
		   
		   int top = (left+2)%8;
		   res += wheel[i][top] * Math.pow(2, i);
	   }
	   return res;
   }
   
}

'언어 > JAVA' 카테고리의 다른 글

[Java] 백준9376 - 탈옥  (1) 2022.11.12
[Java] 백준15683 - 감시  (0) 2022.10.20
[Java] 백준14890 - 경사로  (0) 2022.10.20
[Java] 백준14889 - 스타트와 링크  (0) 2022.10.19
[Java] 백준14888 - 연산자 끼워넣기  (0) 2022.10.19
Comments