J 크 2023. 10. 22. 22:07
728x90
반응형

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

 

14891번: 톱니바퀴

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

www.acmicpc.net

if 천국,,


※  문제를 요약하면 아래와 같습니다.

▶ 8개의 톱니를 가진 톱니바퀴 4개는 각각의 톱니에 N or S를 가지고 있음

▶ 톱니바퀴 하나를 선택해서 시계방향 or 반시계 방향 회전 시키면 톱니는 한 칸씩 이동

 톱니바퀴 선택 후 회전 시키기 전, 초록색 부분을 비교하여 N 과 S 가 반대일 경우, 인접한 톱니바퀴를 반대 방향 회전

 회전 뒤 옆에 톱니바퀴가 없거나 톱니의 값이 일치하기 전까지 계속 비교하여 회전

정해진 회전 횟수와 처음 회전할 톱니바퀴와 방향이 주어졌을 때 아래 기준에 맞추어 점수 출력

  • 1번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 1점
  • 2번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 2점
  • 3번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 4점
  • 4번 톱니바퀴의 12시방향이 N극이면 0점, S극이면 8점

▶ Input : 첫번째~네번째 줄까지 톱니바퀴의 상태가 0은 N극 1은 S극으로 입력, 다섯번째 줄에 회전 갯수 K,

                이후 K개의 줄에 톱니바퀴의 번호와 방향 입력

▶ Output : 위의 규칙에 맞는 최종 점수 출력


◈ Input - 1

10101111
01111101
11001110
00000010
2
3 -1
1 1

◈ Output - 1

7

◈ Input - 2

11111111
11111111
11111111
11111111
3
1 1
2 1
3 1

◈ Output - 2

15

◈ Input - 3

10001011
10000011
01011011
00111101
5
1 1
2 1
3 1
4 1
1 -1

◈ Output - 3

6

 ◎  코드 작성 전, 아래와 같이 솔루션을 정리하였습니다.

▶ 4개의 톱니바퀴 8개의 톱니를 2차원 N극은 false, S극은 true인 boolean 형태 배열로 저장, 

▶ 톱니바퀴를 비교할 때 왼쪽의 톱니는 2번, 오른쪽의 톱니는 6번 톱니를 비교

▶ 비교 결과가 다를 경우, 틀니를 회전

▶ 회전이 되는 톱니바퀴를 전부 확인한 이후, 톱니바퀴의 배열값을 시계방향 or 반시계 방향으로 변경

        (톱니 바퀴 회전값 비교는 모든 톱니가 하나라도 회전 되기 전의 상태를 기준)

▶ 정해진 횟수 만큼 회전 후 , 1~4번 톱니바퀴의 0번값을 갖고와서 문제에서 주어진 공식으로 점수 측정


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
	static boolean[][] barrGear = new boolean[4][8]; // 톱니바퀴 4개, 각각 8개 값

	public static void main(String[] args) throws NumberFormatException, IOException {
		// TODO Auto-generated method stub
		BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bWriter = new BufferedWriter(new OutputStreamWriter(System.out));

		// 톱니바퀴 상태 입력 받고
		for (int i = 0; i < 4; i++) {
			String strLine = bReader.readLine();
			for (int j = 0; j < 8; j++) {
				if (strLine.charAt(j) == '1')
					barrGear[i][j] = true;
			}
		}

		// 톱니바퀴 돌리자
		int K = Integer.parseInt(bReader.readLine());
		for (int i = 0; i < K; i++) {
			StringTokenizer st = new StringTokenizer(bReader.readLine());
			int nNum = Integer.parseInt(st.nextToken()) - 1; // 내껀 인덱스가 0부터 시작
			int nWay = Integer.parseInt(st.nextToken()); // 으데로 돌았니
			
			// 돌려볼까유~
			RotateGear(nNum, nWay);
		}

		int nScore = 0;
		for(int i = 0 ; i < 4; i++) {
			if(barrGear[i][0])
				nScore += Math.pow(2, i);
		}

		bWriter.write(String.valueOf(nScore));
		bWriter.close();
	}

	// 돌려볼까유우~
	private static void RotateGear(int nNum, int nWay) {
		if (nNum == 0) {
			// 1번을 돌렸다
			// 다음 방향으로 ?
			if (barrGear[0][2] != barrGear[1][6]) {
				if (barrGear[1][2] != barrGear[2][6]) {
					if (barrGear[2][2] != barrGear[3][6])
						moveGear(3, -nWay); // 톱니바퀴 4
					moveGear(2, nWay); // 톱니바퀴3
				}
				moveGear(1, -nWay); // 톱니바퀴2
			}
			moveGear(0, nWay); // 톱니바퀴1
		}
		if (nNum == 1) {
			// 2번을 돌렸다
			// 다음 방향으로 ?
			if (barrGear[0][2] != barrGear[1][6]) {
				moveGear(0, -nWay); // 톱니바퀴1
			}
			if (barrGear[1][2] != barrGear[2][6]) {
				if (barrGear[2][2] != barrGear[3][6])
					moveGear(3, nWay); // 톱니바퀴 4
				moveGear(2, -nWay); // 톱니바퀴3
			}
			moveGear(1, nWay); // 톱니바퀴 2
		}
		if (nNum == 2) {
			// 3번을 돌렸다
			// 다음 방향으로 ?
			if (barrGear[1][2] != barrGear[2][6]) {
				if (barrGear[0][2] != barrGear[1][6])
					moveGear(0, nWay); // 톱니바퀴 1

				moveGear(1, -nWay); // 톱니바퀴 2
			}
			if (barrGear[2][2] != barrGear[3][6]) {
				moveGear(3, -nWay); // 톱니바퀴4
			}
			moveGear(2, nWay); // 톱니바퀴 3
		}
		if (nNum == 3) {
			// 4번을 돌렸다
			// 다음 방향으로 ?
			if (barrGear[2][2] != barrGear[3][6]) {
				if (barrGear[1][2] != barrGear[2][6]) {
					if (barrGear[0][2] != barrGear[1][6])
						moveGear(0, -nWay); // 톱니바퀴 1
					moveGear(1, nWay); // 톱니바퀴2
				}
				moveGear(2, -nWay); // 톱니바퀴3
			}
			moveGear(3, nWay); // 톱니바퀴4
		}
	}

	// 톱니바퀴의 넘버와 방향을 받아서 움직이자
	private static void moveGear(int nNum, int nWay) {
		// 시계 방향
		if (nWay == 1) {
			boolean bTemp = barrGear[nNum][7]; // 톱니바퀴의 첫번째값을 저장해놓자
			for (int i = 6; i >= 0; i--)
				barrGear[nNum][i + 1] = barrGear[nNum][i];
			barrGear[nNum][0] = bTemp;

		} else { // 반시계 방향
			boolean bTemp = barrGear[nNum][0]; // 톱니바퀴의 마지막값을 저장해놓자
			for (int i = 0; i < 7; i++)
				barrGear[nNum][i] = barrGear[nNum][i + 1];
			barrGear[nNum][7] = bTemp;
		}

	}

}

Good Luck! (피드백 감사합니다!)