반응형
https://www.acmicpc.net/problem/14891
[ 문제풀이 ]
전형적인 시뮬레이션 문제로써 정말 쉬운 문제이다.
회전할 톱니바퀴를 기준으로 좌우 측의 톱니바퀴의 회전 유무를 체크해 준 후 각 톱니바퀴를 회전시켜주기만 하면 간단하게 해결할 수 있다.
톱니바퀴를 다음과 같이 1차원 배열로 관리하자.
check라는 1차원 배열을 선언한 후 회전할 톱니바퀴를 기준으로 2, 6번 인덱스의 값을 비교해 주면서 회전이 가능한지, 가능하다면 시계(1)/반시계(-1) 방향을 체크해 주면 된다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
static Gear[] gear;
static int[] check; //i번 톱니바퀴를 어느 방향으로 돌릴것인지
static class Gear {
int[] map;
public Gear() {
map = new int[8];
}
}
public static void main(String[] args) throws IOException {
String[] str;
gear = new Gear[4];
check = new int[4];
for (int i = 0; i < 4; ++i) {
str = br.readLine().split("");
gear[i] = new Gear();
for (int j = 0; j < 8; ++j) {
gear[i].map[j] = Integer.parseInt(str[j]);
}
}
int K = Integer.parseInt(br.readLine());
for (int i = 0; i < K; ++i) {
str = br.readLine().split(" ");
int idx = Integer.parseInt(str[0]) - 1; //0번부터 시작하기 위해
int direct = Integer.parseInt(str[1]);
checkIsRotate(idx, direct);
rotateGear();
}
bw.write(getAnswer() + "\n");
bw.flush();bw.close();br.close();
}
//0~3번 톱니바퀴가 시계/반시계 방향으로 회전이 가능한지 확인
public static void checkIsRotate(int idx, int direct) {
Arrays.fill(check, 0);
check[idx] = direct;
//idx기준 좌측 톱니바퀴
for (int i = idx; i > 0; --i) {
if (gear[i].map[6] == gear[i - 1].map[2]) break;
check[i - 1] = -check[i];
}
//idx기준 우측 톱니바퀴
for (int i = idx; i < 3; ++i) {
if (gear[i].map[2] == gear[i + 1].map[6]) break;
check[i + 1] = -check[i];
}
}
public static void rotateGear() {
for (int i = 0; i < 4; ++i) {
if (check[i] == 0) continue;
int temp = gear[i].map[0];
//반시계 방향으로 회전
if (check[i] == -1) {
for (int j = 1; j < 8; ++j) {
gear[i].map[j - 1] = gear[i].map[j];
}
gear[i].map[7] = temp;
}
//시계 방향으로 회전
else {
for (int j = 7; j >= 1; --j) {
gear[i].map[(j + 1) % 8] = gear[i].map[j];
}
gear[i].map[1] = temp;
}
}
}
public static int getAnswer() {
int answer = 0;
for (int i = 0; i < 4; ++i) {
if (gear[i].map[0] == 1) {
answer += 1 << i;
}
}
return answer;
}
}
반응형
'Problem Solving > 삼성 SW 역량 테스트 기출' 카테고리의 다른 글
백준 15684 : 사다리 조작 (0) | 2021.08.02 |
---|---|
백준 15683 : 감시 (0) | 2021.08.02 |
백준 14890 : 경사로 (0) | 2021.08.02 |
백준 14889 : 스타트와 링크 (0) | 2021.08.02 |
백준 14888 : 연산자 끼워넣기 (0) | 2021.08.02 |
댓글