[골드5] 14891. 톱니바퀴 (Java)
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! (피드백 감사합니다!)