https://www.acmicpc.net/problem/14891
import java.util.Scanner;
public class Main {
static int[][] wheel = new int[5][8];
static int K, answer;
static int[] dir;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for(int i=1; i<5; i++) {
String s = sc.next();
char[] c = s.toCharArray();
for(int j=0; j<8; j++) {
wheel[i][j] = c[j]-48;
}
}
K = sc.nextInt();
for(int i=0; i<K; i++) {
int n = sc.nextInt();
int d = sc.nextInt();
dir = new int[5];
// d 가 1 : 시계방향 / -1 : 반시계방향
dir[n] = d;
rotate(n);
}
answer = 0;
for(int i=1; i<5; i++) {
if(wheel[i][0] == 1) {
answer += Math.pow(2, i-1);
}
}
System.out.println(answer);
}
public static void rotate(int n) {
// 왼쪽 탐색
for(int i=n; i>1; i--) {
if(wheel[i][6] != wheel[i-1][2]) dir[i-1] = dir[i]*(-1);
else break;
}
// 오른쪽 탐색
for(int i=n; i<4; i++) {
if(wheel[i][2] != wheel[i+1][6]) dir[i+1] = dir[i]*(-1);
else break;
}
for(int i=1; i<5; i++) {
if(dir[i] == 1) {
rightRotate(i);
} else if(dir[i] == -1) {
leftRotate(i);
}
}
}
public static void rightRotate(int n) {
int temp = wheel[n][7];
for(int i=7; i>0; i--) {
wheel[n][i] = wheel[n][i-1];
}
wheel[n][0] = temp;
}
public static void leftRotate(int n) {
int temp = wheel[n][0];
for(int i=0; i<7; i++) {
wheel[n][i] = wheel[n][i+1];
}
wheel[n][7] = temp;
}
}
8개의 톱니를 가지고 있는 톱니바퀴 4개과 톱니바퀴의 번호, 회전방향이 주어질 때 톱니바퀴를 회전시키고 점수를 계산하는 시뮬레이션 문제입니다. SWEA에서 비슷한 문제를 전에 풀어봤었는데 그 땐 톱니바퀴 하나하나의 회전마다 모든 경우의 수를 계산하여 문제를 풀었습니다. 근데 이번에 새롭게 풀 때에는 톱니바퀴의 번호 왼쪽 오른쪽만 확인하여 훨씬 간단하고 쉽게 풀었던 것 같습니다. 같은 문제를 풀어도 어떻게 생각하냐에 따라서 간단하게 또는 어렵게 풀 수 있다는 것을 느꼈습니다. 시뮬레이션 문제를 풀 때 너무 어렵게 생각하지말고 수식화 할 수 있는 것들은 최대한 수식화 해서 간단하게 풀어야겠습니다.
[ 문제 풀이 ]
1. 배열의 길이 4짜리 dir을 선언하여 방향을 저장했습니다. 만약에 dir[1] = 1 이면 1번 톱니바퀴의 회전방향은 시계방향이라는 뜻이고 dir[2] = -1 이면 2번 톱니바퀴의 회전방향은 반시계방향이라는 뜻입니다. dir[3] = 0 이면 3번 톱니바퀴는 회전을 안한다는 뜻입니다.
2. K 번 반복문을 돌면서 매번 rotate(n) 함수를 시행합니다. n은 n번 톱니바퀴를 회전시킨다는 뜻이고, n 번째 톱니바퀴 왼쪽과 오른쪽을 보면서 톱니가 붙어있는 곳을 확인하여 톱니바퀴를 회전시킬지 회전시키지 않을지 dir에 저장합니다.
3. 왼쪽 오른쪽 탐색이 끝나면 dir에 톱니바퀴의 회전방향이 모두 저장 되어 있으므로 시계방향은 rightRotate, 반시계방향은 leftRotate를 이용해서 톱니바퀴를 회전시킵니다.
'알고리즘 > SW 역량 테스트' 카테고리의 다른 글
[SWEA] 1952. 수영장 (0) | 2019.12.12 |
---|---|
[SWEA] 5656. 벽돌 깨기 (0) | 2019.10.22 |
[15683] 감시 (0) | 2019.10.19 |
[16235] 나무 재테크 (0) | 2019.10.18 |
[15686] 치킨 배달 (0) | 2019.10.17 |