https://www.acmicpc.net/problem/14891
14891번: 톱니바퀴
총 8개의 톱니를 가지고 있는 톱니바퀴 4개가 아래 그림과 같이 일렬로 놓여져 있다. 또, 톱니는 N극 또는 S극 중 하나를 나타내고 있다. 톱니바퀴에는 번호가 매겨져 있는데, 가장 왼쪽 톱니바퀴
www.acmicpc.net
풀이 방법
시뮬레이션 문제이다.
주어진 동작대로 구현만 해주면 되는데 엄청 까다로운 구현은 없었어서 꽤 쉬운 문제였다.
1. 입력 받은 톱니바퀴의 상태를 2차원 배열에 저장한다.
2. 입력 받은 번호와 방향에 따라 먼저 해당 톱니바퀴를 회전시킨다.
3. 반복문으로 바로 왼쪽에 위치한 톱니바퀴부터 왼쪽 방향으로 순차적으로 극을 확인하면서 회전시킨다.
이전의 톱니바퀴와 맞물려 있는 극이 다르면 반대 방향으로 회전시키고, 극이 같은 경우엔 이 이후부턴
회전을 하지 않으므로 반복문을 탈출한다.
주의! 서로 맞물려 있는 극을 확인할 때 회전 후가 아니라 회전하기 전의 극과 확인해야 한다.
회전 구현 방법은
시계 방향 회전 => 해당 톱니바퀴 상태 배열의 값을 오른쪽으로 한 칸씩 옮긴다.
반시계 방향 회전 => 해당 톱니바퀴 상태 배열의 값을 왼쪽으로 한 칸씩 옮긴다.
4. 오른쪽에 있는 톱니바퀴에 대해서도 3번과 같은 방식으로 순차적으로 극을 확인하면서 회전시킨다.
5. K번의 회전을 모두 완료했다면 12시 방향의 극을 확인하면서 합을 구해주면 된다.
코드
import java.io.*;
public class Main {
static int[][] wheel = new int[5][8];
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for(int i=1; i<=4; i++) {
String status = br.readLine();
for(int j=0; j<8; j++) {
wheel[i][j] = Integer.parseInt(status.substring(j, j+1));
}
}
int K = Integer.parseInt(br.readLine());
for(int i=0; i<K; i++) {
String[] line = br.readLine().split(" ");
int num = Integer.parseInt(line[0]); // 톱니바퀴 번호
int d = Integer.parseInt(line[1]); // 방향
int leftPole = wheel[num][6]; // 왼쪽 극
int rightRole = wheel[num][2]; // 오른쪽 극
rotate(num, d);
// 왼쪽 톱니바퀴
int curD = -d;
for(int j=num-1; j>=1; j--) {
if(leftPole == wheel[j][2]) {
break;
}
leftPole = wheel[j][6];
rotate(j, curD);
curD = -curD;
}
// 오른쪽 톱니바퀴 회전
curD = -d;
for(int j=num+1; j<=4; j++) {
if(rightRole == wheel[j][6]) {
break;
}
rightRole = wheel[j][2];
rotate(j, curD);
curD = -curD;
}
}
int sum = 0;
for(int i=1; i<=4; i++) {
if(wheel[i][0] == 1) {
sum += Math.pow(2, i-1);
}
}
System.out.println(sum);
}
public static void rotate(int num, int d) {
if(d == 1) { // 시계 방향 회전
int tmp = wheel[num][7];
for(int i=7; i>=1; i--) {
wheel[num][i] = wheel[num][i-1];
}
wheel[num][0] = tmp;
} else { // 반시계 방향
int tmp = wheel[num][0];
for(int i=0; i<7; i++) {
wheel[num][i] = wheel[num][i+1];
}
wheel[num][7] = tmp;
}
}
}'알고리즘 > baekjoon' 카테고리의 다른 글
| 백준 23288 주사위 굴리기 2 자바(java) (0) | 2024.01.23 |
|---|---|
| 백준 17837 새로운 게임2 자바(java) (1) | 2024.01.21 |
| 백준 2294 동전 2 자바(java) (0) | 2024.01.20 |
| 백준 13460 구슬 탈출2 자바(java) (0) | 2024.01.19 |
| 백준 1912 연속합 자바(java) (0) | 2024.01.19 |