-
백준 14891번, 톱니바퀴Problem Solving 2021. 5. 1. 01:37
문제 링크 : www.acmicpc.net/problem/14891
풀이
각각 톱니가 8개가 있는 톱니바퀴 4개가 주어진다. 이를 회전시킬 때, 톱니가 어떻게 변하는지 계산하는 문제.
톱니를 회전하면 어떻게 데이터를 변경시킬지 고민해야하고, 한 톱니 바퀴를 회전시켰을 때, 맞닿는 톱니와 이에 대한 결과를 생각해야한다. 특히, 맞닿는 조건과 연쇄적으로 회전하는 부분에 대한 구현이 중요했다.
각각의 톱니가 회전하는 것은 동일하고, 톱니에 대한 데이터를 저장해야하므로, 톱니 바퀴에 대한 클래스를 정의했다.
연쇄적으로 회전하는 부분은 재귀 함수를 통해 조건을 만족한다면, 좌, 우 톱니 바퀴가 없을 때까지 재귀 함수를 실행하도록 구현했다.
단 이러한 재귀 함수 부분에서 이미 회전한 톱니 바퀴는 재귀 호출하면 안되기 때문에, 이미 회전했는지 체크할 수 있는 boolean 배열을 추가했다.
import java.util.ArrayList; import java.util.Scanner; public class Main { static class Wheel { int[] number; boolean isAlreadyRotate = false; public Wheel(String numberString) { number = new int[8]; for (int i=0; i<8; i++) { number[i] = Character.getNumericValue(numberString.charAt(i)); } } public void rotateClockwise() { int[] newNumber = new int[8]; for (int i=0; i<7; i++) { newNumber[i+1] = number[i]; } newNumber[0] = number[7]; number = newNumber; } public void rotateCounterClockwise() { int[] newNumber = new int[8]; for (int i=0; i<7; i++) { newNumber[i] = number[i+1]; } newNumber[7] = number[0]; number = newNumber; } public int getLeftRect() { return number[6]; } public int getRightRect() { return number[2]; } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); ArrayList<Wheel> wheels = new ArrayList<>(); for (int i=0; i<4; i++) { wheels.add(new Wheel(scanner.nextLine())); } int testNum = scanner.nextInt(); for (int i=0; i<testNum; i++) { int wheelNum = scanner.nextInt() - 1; int rotateDirection = scanner.nextInt(); rotateWheel(wheels, wheelNum, rotateDirection); for (int j=0; j<4; j++) { wheels.get(j).isAlreadyRotate = false; } } int total = 0; for (int i=0; i<4; i++) { if (wheels.get(i).number[0] == 1) { total += Math.pow(2, i); } } System.out.println(total); } public static void rotateWheel(ArrayList<Wheel> wheels, int wheelNum, int rotateDirection) { wheels.get(wheelNum).isAlreadyRotate = true; if (wheelNum-1 != -1 && wheels.get(wheelNum-1).getRightRect() != wheels.get(wheelNum).getLeftRect() && !wheels.get(wheelNum-1).isAlreadyRotate) { if (rotateDirection == 1) { rotateWheel(wheels, wheelNum-1, -1); } else { rotateWheel(wheels, wheelNum-1, 1); } } if (wheelNum+1 != 4 && wheels.get(wheelNum+1).getLeftRect() != wheels.get(wheelNum).getRightRect() && !wheels.get(wheelNum+1).isAlreadyRotate) { if (rotateDirection == 1) { rotateWheel(wheels, wheelNum+1, -1); } else { rotateWheel(wheels, wheelNum+1, 1); } } if (rotateDirection == 1) { wheels.get(wheelNum).rotateClockwise(); } else { wheels.get(wheelNum).rotateCounterClockwise(); } } }
'Problem Solving' 카테고리의 다른 글
백준 1697번 숨바꼭질 (Java) (0) 2021.06.29 백준 14890번(Java) 경사로 (0) 2021.06.04 백준 1260, DFS와 BFS (0) 2020.04.26 프로그래머스 Level2 - 탑 (0) 2020.04.24 백준 10828번, 스택 자바로 구현 (0) 2020.04.22