[백준] 14891_톱니바퀴 (Java)

강민수·2023년 8월 25일

Algorithm-BACKJOON

목록 보기
53/55
post-thumbnail

✨ 문제


백준 14891 톱니바퀴

🎈 접근 방식


  1. 어떤 톱니바퀴를 어디로 회전시킬지 입력값에 따라서 좌측과 우측을 살펴줘야 한다.
  2. 좌측이든 우측이든 반복문으로 확인을 해주는데 만약 맞닿은 부분이 같다면 그 다음 톱니바퀴는 회전하지 않으므로 break를 통해 빠져나온다.
  3. 몇번 톱니바퀴를 회전할지를 결정했다면 이제 전부 회전을 시켜주면서 총 회전 횟수 K만큼 끝나면 점수를 구해준다.

이 문제에서는 어떤 톱니바퀴를 몇번 회전시킬지 주어졌다고 해서 바로 회전시키지 말고 그 톱니바퀴로 인해 다른 톱니바퀴도 움직일 수 있기 때문에 전부 고려해주고 나중에 한번에 돌려주도록 해야 한다!!

😫 실수한 점이나 놓친 점


문제를 대충 읽어서 점수 계산을 할 때 실수하였다,,

💻 풀이 코드

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

public class Main {
	static int K, ans;
	static int[][] wheel;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		wheel = new int[5][9];

		for (int i = 1; i <= 4; i++) {
			String s = br.readLine();
			for (int j = 0; j < 8; j++) {
				wheel[i][j] = s.charAt(j) - '0';
			}
		}

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

		// K번만큼 회전을 시켜주면서
		for (int i = 0; i < K; i++) {
			st = new StringTokenizer(br.readLine());
			int num = Integer.parseInt(st.nextToken()); // 몇번 톱니바퀴를
			int w = Integer.parseInt(st.nextToken()); // 어느 방향으로
			checkDir(num, w);
		}

		// 총 K번만큼 회전을 다 시켰다면 점수 합산
		if (wheel[1][0] == 1) {
			ans += 1;
		}
		if (wheel[2][0] == 1) {
			ans += 2;
		}
		if (wheel[3][0] == 1) {
			ans += 4;
		}
		if (wheel[4][0] == 1) {
			ans += 8;
		}

		System.out.println(ans);
	}

	// 어떤 톱니바퀴를 회전시킬지 결정
	static void checkDir(int num, int w) {
		HashMap<Integer, Integer> hashMap = new HashMap<>();
		hashMap.put(num, w);
		// 좌측으로 먼저 검사
		for (int i = num - 1; i >= 1; i--) {
			if (wheel[i + 1][6] != wheel[i][2]) {
				hashMap.put(i, hashMap.get(i + 1) * -1);
			} else {
				break;
			}
		}
		// 우측으로 검사
		for (int i = num + 1; i <= 4; i++) {
			if (wheel[i - 1][2] != wheel[i][6]) {
				hashMap.put(i, hashMap.get(i - 1) * -1);
			} else {
				break;
			}
		}
		turn(hashMap);
	}

	// 톱니바퀴 회전시키기
	static void turn(HashMap<Integer, Integer> hash) {
		for (Map.Entry<Integer, Integer> entry : hash.entrySet()) {
			int row = entry.getKey(); // 몇번째 바퀴를
			int val = entry.getValue(); // 어느 방향으로 돌릴지
//			System.out.println("row= " + row);
//			System.out.println("val= " + val);

			if (val == -1) {
				int temp = wheel[row][0]; // 맨 앞의 값을 임시저장
				for (int i = 0; i < 7; i++) {
					wheel[row][i] = wheel[row][i + 1];
				}
				wheel[row][7] = temp;
			} else if (val == 1) {
				int temp = wheel[row][7];
				for (int i = 7; i > 0; i--) {
					wheel[row][i] = wheel[row][i - 1];
				}
				wheel[row][0] = temp;
			}
		}
	}
}
profile
능동적으로 개발 지식을 찾아다니는 백엔드 개발자입니다 😊 작성된 글에 대한 질문들 및 피드백은 언제나 환영입니다 :) 👌

0개의 댓글