console.log

[BOJ] 14891 톱니바퀴 JAVA 본문

알고리즘/백준

[BOJ] 14891 톱니바퀴 JAVA

foresight 2023. 9. 25. 17:19

 

단순 구현 문제 !!

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

 

14891번: 톱니바퀴

총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴

www.acmicpc.net

 

메모리 : 11716 kb
실행시간 : 80 ms

 

문제분석

단순 구현 문제 !!

 

걸린시간

40분 ⏱️

 

풀이방법

N : 0 S : 1

1번 톱니 (2인덱스 값) != 2번 톱니 (6인덱스 값) -> 반대로 회전
2번 톱니 (2인덱스 값) != 3번 톱니 (6인덱스 값) -> 반대로 회전
3번 톱니 (2인덱스 값) != 4번 톱니 (6인덱스 값) -> 반대로 회전

만약 같을 경우 그 뒤 or 앞은 전부 회전하지 않음 !!!

(1) 시계 방향 : 한 칸씩 뒤로 옮기기 (맨 뒤에 값 temp에 담아두기)
(-1) 반시계 방향 : 한 칸씩 뒤로 옮기기 (맨 앞에 값 temp에 담아두기)

 

포인트

문제 해석만 잘 하면 될 것 같다
※ Collections.rotate 활용하면 편리 ...

 

코드

package study.day0818;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BOJ_14891_톱니바퀴 {
	static int[][] map;	// 톱니바퀴 정보
	static int[] arr;	// 회전 정보
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		map = new int[4][8];	
		String[] temp;
		for (int i = 0; i < 4; i++) {	// 톱니바퀴 받아오기
			temp = br.readLine().split("");
			for (int j = 0; j < 8; j++) {				
				map[i][j] = Integer.parseInt(temp[j]);
			}
		}
		int K = Integer.parseInt(br.readLine());
		int g, r; 
		for (int i = 0; i < K; i++) {	// 회전방향 저장하기
			arr = new int[4];
			temp = br.readLine().split(" ");
			g = Integer.parseInt(temp[0]);
			r = Integer.parseInt(temp[1]);
			arr[g - 1] = r;
			for (int j = g - 1; j < 3; j++) {	// 뒤에 톱니바퀴들
				if(j != g - 1 && arr[j] == 0) break;
				if(map[j][2] != map[j + 1][6]) arr[j + 1] = arr[j] == -1 ? 1 : -1;
			}
			for (int j = g - 1; j > 0; j--) {	// 앞에 톱니바퀴들
				if(j != g - 1 && arr[j] == 0) break;
				if(map[j][6] != map[j - 1][2]) arr[j - 1] = arr[j] == -1 ? 1 : -1;
			}
			rotation();
		}

		int result = 0;
		for (int i = 0; i < map.length; i++) {	// 점수 계산
			result += map[i][0] == 0 ? 0 : Math.pow(2, i);
		}
		System.out.println(result);
	}

	private static void rotation() {	// 회전
		int temp;
		for (int i = 0; i < arr.length; i++) {
			if(arr[i] == 1) {	// 시계방향 (한 칸씩 뒤로)
				temp = map[i][7];
				for (int j = map[i].length - 1; j > 0; j--) {
					map[i][j] = map[i][j - 1];
				}
				map[i][0] = temp;
			}else if(arr[i] == -1){	// 반시계방향 (한 칸씩 앞으로)
				temp = map[i][0];
				for (int j = 0; j < map[i].length - 1; j++) {
					map[i][j] = map[i][j + 1];
				}
				map[i][7] = temp;
			}
		}
	}
}

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

[BOJ] 17070 파이프 옮기기 1 JAVA  (2) 2023.10.02
[BOJ] 16637 괄호 추가하기 JAVA  (0) 2023.10.01
[BOJ] 1759 암호 만들기 JAVA  (0) 2023.09.24
[BOJ] 12904 A와 B JAVA  (0) 2023.09.19
[BOJ] 1790 수 이어 쓰기 2 JAVA  (0) 2023.09.15