알고리즘/백준

14891_톱니바퀴

베리영young 2024. 6. 13. 22:22

사용 알고리즘: 구현 빡

사용 언어: java

 

package src;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;

/**
 * N극은 0
 * S극은 1
 *
 * 1번 톱니바퀴: 2인덱스(2번 톱니)
 * 2번 톱니바퀴: 6인덱스(1번 톱니)
 *           2인덱스(3번 톱니)
 * 3번 톱니바퀴: 6인덱스(2번 톱니)
 *           2인덱스(4번 톱니)
 * 4번 톱니바퀴: 6인덱스(3번 톱니)
 */

public class Main_bj_14891_톱니바퀴 {
    static ArrayList<ArrayList<Integer>> wheels = new ArrayList<>(4);
    static int[] directoins; //돌릴 방향

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        
        for(int i=0; i<4; i++) {
        	String s = br.readLine();
        	ArrayList<Integer> wheel = new ArrayList<>(8);
        	for(int j=0; j<8; j++) {
        		wheel.add(s.charAt(j) - '0');
        	}
        	wheels.add(wheel);
        }
        
        int k = Integer.parseInt(br.readLine()); //회전 횟수
        for(int i=0; i<k; i++) {
        	st = new StringTokenizer(br.readLine());
        	int wheelNum = Integer.parseInt(st.nextToken()) - 1;
        	int dir = Integer.parseInt(st.nextToken());
        	
        	solve_14891(wheelNum, dir);
        }
        
        //점수 계산
        int ans= 0;
        for(int i=0; i<4; i++) {
        	if(wheels.get(i).get(0) == 1) {
        		ans += Math.pow(2, i);
        	}
        }
        //답 출력
        System.out.println(ans);
    }

	private static void solve_14891(int wheelNum, int dir) {
		directoins = new int[4];
		directoins[wheelNum] = dir;
		//방향 배열
		  //기준 톱니 왼쪽
		for(int i=wheelNum-1; i>=0; i--) {
			//왼 2 오 6
			if(wheels.get(i).get(2) == wheels.get(i+1).get(6)) break; //더 안 돌려도 됨
			else {
				directoins[i] = directoins[i+1] == -1 ? 1 : -1;
			}
		}
		  //기준 톱니 오른쪽
		for(int i=wheelNum+1; i<4; i++) {
			if(wheels.get(i).get(6) == wheels.get(i-1).get(2)) break;
			else {
				directoins[i] = directoins[i-1] == -1? 1 : -1;
			}
		}
		
		//방향 배열에 맞게 회전
		for(int i=0; i<4; i++) {
			if(directoins[i] == 0) continue;
			else if(directoins[i] == -1) { //반시계 방향으로 돌리기
				//앞을 뺴서 뒤로 넣기
				int tmp = wheels.get(i).remove(0);
				wheels.get(i).add(tmp);
			}
			else {
				int tmp = wheels.get(i).remove(7);
				wheels.get(i).add(0, tmp);
			}
		}
	}
}
class DirInfo {
	int wheelNum;
	int dir;
	
	public DirInfo(int wheelNum, int dir) {
		this.wheelNum = wheelNum;
		this.dir = dir;
	}
}

 

어케 돌리지..했는데

돌릴 방향을 저장하는 배열을 만들어서 돌리면 됐다

그렇다...

 

'알고리즘 > 백준' 카테고리의 다른 글

12100_2048 (Easy)  (1) 2024.06.14
1041_주사위 *  (1) 2024.06.14
3190_뱀  (1) 2024.06.13
1062_가르침 **  (0) 2024.06.13
1253_좋다  (0) 2024.06.13