재채기는 H

백준 14891 - 톱니바퀴 JAVA 본문

알고리즘

백준 14891 - 톱니바퀴 JAVA

에취~H 2020. 7. 28. 12:43
반응형

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

 

14891번: 톱니바퀴

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

www.acmicpc.net

 

 

시뮬레이션 문제

푸는데 오래 걸렸고 나한테는 어려웠던 문제... 

그래서 다른 분의 코드를 참고해서 해결하였다.

 

처음에 톱니바퀴가 도는 부분에서 하나의 메서드 안에서 해결하려고 했다. 

그러니 조건이 많아지고 코드가 길어졌다. 나중에는 조건에서 값들이 꼬여버려서 결국 나의 작성 코드를 버려야 했다.

이때 받은 스트레스는 정말 말로 표현할 수가 없다...

 

 

아래 코드에서는 왼쪽, 오른쪽으로 나아가는 메서드를 만들었고 마주 보는 방향이 같다면 회전을 시켜 나아갔다.

 

이와 같이

문제의 기능마다의 메서드를 나눌 수 있게 더 열심히 공부해야겠다. 

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class 백준_톱니바퀴_14891 {
	static int[][] wheelArr = new int[4][8];
	static int K;
	static boolean[] check;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		for (int i = 0; i < 4; i++) {
			String s = br.readLine();
			int r = 0, l = 0;
			for (int j = 0; j < 8; j++) {
				wheelArr[i][j] = s.charAt(j) - '0';
			}
		}

		K = Integer.parseInt(br.readLine().trim());

		StringTokenizer st;
		for (int i = 0; i < K; i++) {
			st = new StringTokenizer(br.readLine());
			check = new boolean[3];
			solution(Integer.parseInt(st.nextToken()) - 1, Integer.parseInt(st.nextToken()));
		}

		int total = 0;
		if (wheelArr[0][0] == 1) {
			total += 1;
		}
		if (wheelArr[1][0] == 1) {
			total += 2;
		}
		if (wheelArr[2][0] == 1) {
			total += 4;
		}
		if (wheelArr[3][0] == 1) {
			total += 8;
		}
		System.out.println(total);
	}

	// 9시 방향은 2, 3시 방향은 6
	static void solution(int idx, int dir) {
		left(idx - 1, -dir);
		right(idx + 1, -dir);
		rotate(idx, dir);
	}

	// 왼쪽에 있던 톱니바퀴 회전 여부 결정
	static void left(int idx, int dir) {
		if (idx < 0)
			return;

		if (wheelArr[idx][2] != wheelArr[idx + 1][6]) {
			left(idx - 1, -dir);
			rotate(idx, dir);
		}
	}

	// 오른쪽에 있던 톱니바퀴 회전 여부 결정
	static void right(int idx, int dir) {
		if (idx > 3)
			return;

		if (wheelArr[idx][6] != wheelArr[idx - 1][2]) {
			right(idx + 1, -dir);
			rotate(idx, dir);
		}
	}

	// dir = 1 시계방향, dir = -1 반시계방향
	static void rotate(int idx, int dir) {
		if (dir == 1) {
			int temp = wheelArr[idx][7];

			for (int i = 7; i > 0; i--) {
				wheelArr[idx][i] = wheelArr[idx][i - 1];
			}

			wheelArr[idx][0] = temp;

		} else {
			int temp = wheelArr[idx][0];

			for (int i = 0; i < 7; i++) {
				wheelArr[idx][i] = wheelArr[idx][i + 1];
			}

			wheelArr[idx][7] = temp;
		}
	}
}
반응형

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

백준 15686 - 치킨 배달 JAVA  (0) 2020.07.28
백준 15684 - 사다리 조작 JAVA  (0) 2020.07.28
백준 15683 - 감시 JAVA  (0) 2020.07.25
백준 14889 - 스타트와 링크 JAVA  (0) 2020.07.24
백준 14888 - 연산자 끼워넣기 JAVA  (0) 2020.07.24
Comments